SELECT值x WHERE x具有相同的未知值AND WHERE值y在数组中

时间:2013-03-27 13:53:27

标签: mysql sql select relational-division

我有一个存储产品组的表。

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

我需要一个SQL查询,它将找到包含给定数组中所有id_product的id_group。

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一起使用

背景信息:每种产品都有价格,但产品可以在具有包装价格的产品组中。这就是为什么我需要知道每个订单的产品是否在一个组中。

1 个答案:

答案 0 :(得分:3)

此问题称为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