2013-02-05 47 views
0

that's我下面的情况:MySQL的 - 交叉表 '其中' 与记录

表:选择

selection_id | group_id | selection_group_id | 
------------------------------------------------ 
    1   1    1 

表:选择

selector_id | selection_id | name | index 
------------------------------------------ 
    1    1   Step1 0 
    2    1   Step2 1 
    3    1   Step3 2 

我的问题:哪有我找出构成选择单元的具有联合信息“Step1,Step2,Step3”的选择器的唯一'selection_id'

我试图更准确地描述它:我需要一个例程得到3个选择与相同“selection_id”连接独特的“selection_id”。我的信息是选择器的'姓名'和'索引'。 “选择器”的名称可能会频繁发生,但选择器的连续索引是唯一的。 -

+0

这是一个内衬SQL JOIN选择。这是关于三个步骤的? – chris

+0

这些步骤代表一个设置,其中“选择”是选择器的父项,并且可以包含无限孩子的“选择器”。 –

回答

0

我已成立了我自己的解决方案:http://sqlfiddle.com/#!2/fdbba/20/0

SELECT selections.selection_id FROM `prstshp_productsort_groups_selections` selections 
WHERE EXISTS (SELECT * FROM `prstshp_productsort_groups_selectors` s3 
       WHERE s3.name = "Muskelaufbau" AND s3.index = 0 AND s3.selection_id = selections.selection_id) 
AND 
EXISTS (SELECT * FROM `prstshp_productsort_groups_selectors` s4 
       WHERE s4.name = "Mesomorph" AND s4.index = 1 AND s4.selection_id = selections.selection_id) 
AND 
EXISTS (SELECT * FROM `prstshp_productsort_groups_selectors` s5 
       WHERE s5.name = "Männlich" AND s5.index = 2 AND s5.selection_id = selections.selection_id) 
AND 
EXISTS (SELECT * FROM `prstshp_productsort_groups_selectors` s6 
       WHERE s6.name = "25-40" AND s6.index = 3 AND s6.selection_id = selections.selection_id) 
0

我想你想使用GROUP_CONCAT - 不知道你甚至需要JOIN你的表:

SELECT selection_id, GROUP_CONCAT(name) 
FROM selectors 

这里是SQL Fiddle

,并找出独特selection_id:

SELECT DISTINCT Selection_ID 
FROM (
    SELECT selection_id, GROUP_CONCAT(name) gc 
    FROM selectors 
) t 
WHERE gc = 'Step1,Step2,Step3' 

http://sqlfiddle.com/#!2/4609f/13

让我知道如果我误解你的问题。

祝你好运。

+0

谢谢你的想法,但这是不可能的,因为我有许多其他选择器,它们在表中具有相同的名称和不同的顺序。 –

+0

你可以显示样本输入和期望的结果吗?我对你期望的结果还是有点困惑。你可以创建一个小提琴吗? – sgeddes

+0

是的,在这里http://sqlfiddle.com/#!2/fdbba/2/0谢谢! :) –

0

对于这一点,你需要用having条款聚集。例如:

select selector_id 
from selectors s 
group by selector_id 
having max(case when name = 'Step1' then 1 else 0 end) = 1 and 
     max(case when name = 'Step2' then 1 else 0 end) = 1 and 
     max(case when name = 'Step3' then 1 else 0 end) = 1 and 
     max(case when name in ('Step1', 'Step2', 'Step3') then 0 else 1 end) = 0 

我觉得这个方法是最一般的。 。 。使用基于条件最大值的having声明以及各种条件。还有其他一些表达方式,比如:

select selector_id 
from selectors s 
group by selector_id 
having count(distinct name) = 3 and 
     max(case when name in ('Step1', 'Step2', 'Step3') then 0 else 1 end) = 0 

看起来比较简单,但不是一般的形式。

+0

我试图更准确地描述它:我需要一个例程,它可以从与select_id相同的3个选择器中获得唯一的'selection_id'。我的信息是选择器的'姓名'和'索引'。 '选择器'的名字可以频繁出现,但是选择器的连续'索引'是唯一的。 –

+0

我认为在这里提供的解决方案的一些变化应该让你得到你想要的。如果没有,请考虑为我们提供一个完整的数据集(作为一个sqlfiddle和/或一套DDL)。 – Strawberry