SQL如何查找仅包含特定购物车项目的购物车?

时间:2013-10-17 14:43:34

标签: sql

假设我有两个表,table cart和cart_item。购物车可以有一个或多个cart_items。

Cart_items是来自物品表的“模板化”。对于多个cart_items,item_name之类的属性将相同。我想创建一个返回所有购物车(所有购物车属性而不仅仅是id)的查询,其中包含名为Apple AND Banana AND Carrot的cart_items。

以下是我尝试的几个例子。

Table cart 
cart_id_pk
cart_desc
cart_total
etc...

Table cart_item
item_id
item_name
cart_id_fk 

我的第一次尝试:

SELECT * FROM cart_item ci
LEFT JOIN cart c
ON ci.cart_id_fk = c.cart_id
WHERE ci.item_name = 'Apple' AND ci.item_name = 'Banana' AND ci.item_name = 'Carrot'
GROUP BY c.cart_id_pk

这不起作用,因为select中的每一行只包含一个cart_item。

我的第二次尝试:

WHERE ci.item_name = 'Apple' OR ci.item_name = 'Banana' OR ci.item_name = 'Carrot'

这不起作用,因为它将返回包含任何cart_items中的至少一个的购物车。

立即修改子查询..不确定我是否在正确的轨道上。

帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

你需要

WHERE c.cart_id_pk IN (
    SELECT ci.cart_id_fk 
    FROM cart_item ci 
    WHERE ci.item_name = "Apple")
AND c.cart_id_pk IN (
    SELECT ci.cart_id_fk 
    FROM cart_item ci 
    WHERE ci.item_name = "Banana")
AND c.cart_id_pk IN (
    SELECT ci.cart_id_fk 
    FROM cart_item ci 
    WHERE ci.item_name = "Carrot")

作为WHERE声明...

这应该有用。

答案 1 :(得分:1)

您可以使用COUNT(*)子句来计算子查询中的匹配项,如下所示:

SELECT * 
FROM   cart c
WHERE  cart_id IN (SELECT    cart_id_fk
                   FROM      cart_item
                   WHERE     item_name IN ('Apple', 'Banana', 'Carrot')
                   GROUP BY  cart_id_fk
                   HAVING    COUNT(*) = 3 /* number of matching items*/ )

注意:此解决方案假设同一购物车不能有多个苹果。根据OP,不确定这是否正常。