1

製品グループを格納するテーブルがあります。

table "products_groups"

id  |  id_group | id_product
============================
 1  |  1        | 1
 2  |  1        | 2
 3  |  1        | 3
 4  |  2        | 1
 5  |  2        | 2
 6  |  3        | 2

指定された配列にあるすべてのid_productを含むid_groupを見つけるSQLクエリが必要です。

product_ids = array(1);       // should return no results
product_ids = array(1,2);     // should only return id_group 2
product_ids = array(1,2,3);   // should only return id_group 1
product_ids = array(1,2,3,4); // should return no results

私は遊んだり検索したりして、行き詰まってしまいました

SELECT p1.id_group
FROM products_groups p1, products_groups p2
WHERE p1.id <> p2.id
AND p1.id_group = p2.id_group
AND (
    p1.id_product = 1 
    OR p1.id_product = 2
    OR p1.id_product = 3
)

しかし、それは明らかに私が探している結果を私に与えていません。単純すぎるのか複雑すぎるのかわかりません。

注:もちろん、id_product値はSQLで動的に生成されます。最終的にはPHP/Codeigniterで使用されます

背景情報:各製品には価格がありますが、製品はパッケージ価格のある製品グループに含めることができます。そのため、製品がグループに含まれているかどうかを注文ごとに知る必要があります。

4

1 に答える 1

4

この問題はと呼ばれますRelational Division

SELECT  id_group
FROM    products_groups
WHERE   id_product IN (1,2)
GROUP   BY id_group
HAVING  COUNT(*) = 2

またはこのようなもの、

SELECT  id_group
FROM    products_groups
GROUP   BY id_group
HAVING  SUM(id_product IN (1,2)) = COUNT(*) AND
        COUNT(*) = 2
于 2013-03-27T13:56:08.153 に答える