2012-04-19 68 views
0

我有一個項目表。mysql連接,分組數據和比較?

第二張變化表。

每個項目可以有多種變化。

我試圖像這樣:

SELECT items.*, variations.id from items 
JOIN variations 
ON variations.item_id = items.id 
WHERE variations.id IN (23,25,29) 
GROUP BY items.id 

這將返回具有上述所有的變化,23,25和29

我還需要返回所有變化的任何項目。返回的item.id的id值。

我試過一堆不同的連接解決方​​案,但不認爲這是要走的路。子查詢是答案嗎?任何想法將不勝感激。

+0

如果刪除'group by'子句會發生什麼情況? – ethrbunny 2012-04-19 15:15:08

回答

1
SELECT i.*, v.id 
FROM items i 
JOIN variations v 
ON  v.item_id = i.id 
WHERE (
     SELECT COUNT(DISTINCT vi.id) 
     FROM variations vi 
     WHERE vi.item_id = i.id 
       AND vi.id IN (23, 25, 29) 
     ) = 3 
+0

這很棒,你很棒。 – 2012-04-19 18:14:08

0

您可以通過使用COUNT(*)和HAVING,或在這種情況下,由於只有3項做,可以明確TWICE JOIN的預期變化...

此使用具有/計數並且比使用WHERE IN(SUBSELECT)更高效。它用一個查詢對所有項目進行FIRST預審,然後將該結果加入項目。

select i.* 
    from 
     (select v.item_id 
      from variations v 
      where v.id in (23, 25, 29) 
      group by v.item_id 
      having count(*) = 3) PreQualified 
     JOIN Items i 
     on PreQualified.Item_ID = i.id