0

アイテムのテーブルがあります。

そして、バリエーションの2番目の表。

アイテムごとに複数のバリエーションが存在する場合があります。

私は次のようなことを試みています:

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 値を返す必要があります。

さまざまな結合ソリューションを試しましたが、それが正しいとは思いません。サブクエリは答えですか?どんな考えでも大歓迎です。

4

3 に答える 3

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
于 2012-04-19T15:16:33.357 に答える
0

count(*) と HAVING を使用して行うことができます。または、この場合、エントリが 3 つしかないため、予想されるバリエーションに対して明示的に 2 回結合できます...

これは、having/count を使用し、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
于 2012-04-19T15:19:28.803 に答える
0

たぶん GROUP_CONCAT(variations.item_id) が正しい選択になるでしょうか (参照: http://dev.mysql.com/doc/refman/5.1/de/group-by-functions.html )?

確信はないけど。

于 2012-04-19T15:13:33.047 に答える