2012-04-19 5 views
0

私はアイテムのテーブルを持っています。mysql join、グループ化されたデータ、および比較?

そして第2のバリエーションの表。

アイテムごとに複数のバリエーションがあります。上記のバリエーションのALL、23、25および29

私もすべてのバリエーションを返す必要があります任意の項目を返します

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 

は、私のような何かをしようとしています。返されたitem.idsのid値。

私はさまざまな結合ソリューションのヒープを試しましたが、それは方法だとは思わない。サブクエリは答えですか?どんな考えも大いに評価されるだろう。

+0

'group by'句を削除するとどうなりますか? – ethrbunny

答えて

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

それは素晴らしいです、そしてあなたは素晴らしいです。 –

0

多分、GROUP_CONCAT(variations.item_id)があなたのために選択されるでしょうか(参考:http://dev.mysql.com/doc/refman/5.1/de/group-by-functions.html)?

でもわかりません。

あなたはCOUNT(*)を使用して持っていることによって行うことができ、あるいはこのような場合には、唯一の3エントリ以来、明示的に...予想変動をTWICE

に参加できこれが持つ/カウントを使用

0

WHERE IN(SUBSELECT)を使用するより効率的です。 1つのクエリですべてのアイテムを事前取得し、その結果をアイテムに結合します。

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