2

パッケージと製品の間に次の関連テーブルがあります(簡略化):

package_id     product_id    count
1              1             6
1              2             1
1              3             1
2              1             6
2              2             1
3              1             6
4              1             8
4              2             1

package_id私が提供する製品とその数を正確に含む特定の を選択できるクエリを作成する方法を考え出そうとしています。(product_id = 1 AND count = 6) AND (product_id = 2 AND count = 1)したがって、:を含むパッケージを見つけようとすると、他の製品や他のカウントが含まれているため、2のみが返され、他のものは返されません。package_id

SQL の代わりに自分のコード (PHP) でこれを解決できれば幸いですが、クエリの底に到達しようとしているので、これがどのように行われるかを知りたいです。

4

1 に答える 1

1

これはと呼ばれますRelational Division

SELECT  a.package_ID
FROM    tableName a
WHERE   (a.product_ID = 1 AND a.count = 6) OR
        (a.product_ID = 2 AND a.count = 1)
GROUP   BY a.package_ID
HAVING  COUNT(*) = 2 AND
        COUNT(*) = (SELECT COUNT(*) FROM tableName WHERE package_ID = a.package_ID)

また

SELECT  package_ID
FROM    tableName
WHERE   (product_ID, `count`) in ((1, 6), (2, 1))
GROUP   BY package_ID
HAVING  COUNT(DISTINCT product_ID, `count`) = 2 AND
        COUNT(*) = (SELECT COUNT(*) FROM tableName WHERE package_ID = a.package_ID)
于 2013-02-19T07:42:51.453 に答える