购物篮:带选项的产品,如何检查组合是否存在?

时间:2014-11-08 13:27:16

标签: sql

我有一点SQL问题,我希望有人可以提供帮助。

在我的网站上,有人可以订购产品,然后订购该产品的选项,例如:他们买车,以及轮胎,立体声系统等选项。客户可以为同一主要项目(汽车)添加多个项目到他们的购物篮,但随后可以选择不同的选项,例如:

汽车,倍耐力,b& o 汽车,米其林,b& o

我有这个数据库结构来实现这个目标:

orders
----------
order_ref
total


orders_parts
------------
id
order_ref
part_id
quantity


orders_parts_options
--------------------
id
option





orders
------
12345     1000.01



orders_parts
------------
1001   12345     Audi     1
1002   12345     Audi     1



orders_parts_options
--------------------
1001    michelin
1001    b&o
1002    pirelli
1002    b&o

所以在这里你可以看到我的购物篮中有两个Audis,一个带有michelin,一个带有倍耐力,两个带有B& O音频系统。我的问题;让我们说另一个电话是为了这个订单添加一个项目到购物篮,例如另一辆奥迪与米其林和B& O,我需要什么SQL来获得1001的orders_parts.id?

我想出了一点垃圾:

SELECT op.id FROM orders_parts op
    INNER JOIN orders_parts_options opo ON (op.id = opo.id)
WHERE op.order_ref = 12345 AND (opo.option = 'michelin' OR opo.option = 'b&o')

但我得到了这个结果

1001 
1001
1002 
从那起。我猜我需要聚合它并且在那里有一个count = 2,但是无法解决它。那些能帮助我的人更聪明吗?

(只是为了补充一点,数据库在现实生活中是标准化的,但为了清楚起见,我还有全文值)。

1 个答案:

答案 0 :(得分:1)

SELECT op.id, count(op.id) as n FROM orders_parts op
    INNER JOIN orders_parts_options opo ON (op.id = opo.id)
WHERE op.order_ref = 12345 AND (opo.option = 'michelin' OR opo.option = 'b&o')
GROUP BY op.id;

此查询检索order_ref = 12345的所有部分(及其编号),其中option ='michelin'或option ='b& o'