2013-02-05 46 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