2009-12-13 31 views
1

行的連接選擇行我有三個表:與組從第二表

project (idproject, name) 

color (idcolor, name) 

project_has_color (idproject, idcolor) 

現在我需要選擇與組顏色連接的項目,例如:藍色(1),紅色(2),綠色(3):

SELECT p.idproject, p.name 
FROM project p, project_has_color c 
WHERE p.idproject=c.idproject AND c.idcolor IN (1,2,3) 

讓我給定idcolor 一個或多個連接項目,我需要他們的所有有關的項目 - 但我無法弄清楚如何實現這一目標?

回答

5

使用連接是最可靠的方法:

SELECT p.idproject, 
     p.name 
    FROM PROJECT p 
    JOIN PROJECT_HAS_COLOR phc ON phc.idproject = p.idproject 
    JOIN COLOR c1 ON c1.idcolor = phc.idcolor 
       AND c1.idcolor = 1 
    JOIN COLOR c2 ON c2.idcolor = phc.idcolor 
       AND c2.idcolor = 2 
    JOIN COLOR c3 ON c3.idcolor = phc.idcolor 
       AND c3.idcolor = 3 

使用:

SELECT p.idproject, 
     p.name 
    FROM PROJECT p 
    JOIN PROJECT_HAS_COLOR phc ON phc.idproject = p.idproject 
    JOIN COLOR c ON c.idcolor = phc.idcolor 
    WHERE c.idcolor IN (1, 2, 3) 
GROUP BY p.idproject, p.name 
    HAVING COUNT(*) = 3 

...依賴於你的數據模型被關聯到一個項目中不止一次停止的idcolor值。您不能在MySQL中使用HAVING COUNT(DISTINCT *),因此同一項目的2+關係重複idcolor值會返回誤報。

+0

所有冰雹自我加入。 +1 – 2009-12-13 21:07:10

+0

查詢計劃的外觀如何? – 2009-12-13 21:15:49

+0

感謝這個線索 - 最後我只使用2個表,它作爲一組連接:「JOIN project_has_color c1 ON(c1.idproject = p.idproject AND c1.idcolor = 1)JOIN project_has_color c2 ON(c2.idproject = p.idproject AND c2.idcolor = 2)...「 – Marek 2009-12-13 21:34:15

0

這可能工作

SELECT p.idproject, p.name 
FROM project p JOIN project_has_color c USING (idproject) 
WHERE c.idcolor IN (1,2,3) 
HAVING count(*)=3; 

提供項目不能與顏色相關聯的兩倍(即(idproject,idcolor)是唯一的)。或者

HAVING 
    count(CASE WHEN c.idcolor=1 THEN 1 ELSE NULL)>0 
    AND count(CASE WHEN c.idcolor=2 THEN 1 ELSE NULL)>0 
    AND count(CASE WHEN c.idcolor=3 THEN 1 ELSE NULL)>0; 

否則。