2

假设我有两张桌子,桌子购物车和购物车项目。一个购物车可以有一个或多个 cart_items。

Cart_items 是从项目表中“模板化”的。像 item_name 这样的属性对于多个 cart_items 是相同的。我想创建一个查询,该查询返回包含名为 Apple AND Banana AND Carrot 的购物车项目的所有购物车(所有购物车属性,而不仅仅是 id)。

以下是我尝试过的几个示例。

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

这是行不通的,因为选择中的每一行只包含一个 cart_item。

我的第二次尝试:

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

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

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

帮助表示赞赏。

4

2 回答 2

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声明...

这应该有效。

于 2013-10-17T14:50:52.493 回答
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,不确定这是否可以。

于 2013-10-17T14:54:07.677 回答