假设我有两个表,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中的至少一个的购物车。
立即修改子查询..不确定我是否在正确的轨道上。
帮助表示赞赏。
答案 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,不确定这是否正常。