2014-11-08 63 views
0

我有一个SQL问题,我希望有人可以帮助。购物篮:带选项的产品,如何检查组合是否存在?

在我的网站上,有人可以订购产品,然后选择该产品的选项,例如他们买了一辆车,还有诸如轮胎,立体声系统等选项。客户可以将多个项目添加到自己的篮子相同的主项目(汽车),但后来它不同的选项,如:

车,倍耐力,B &Ø 汽车,米其林,B &Ø

我有这个DB结构来实现这一目标:

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 

所以在这里你可以看到我有两个奥迪在我的购物篮,一个与米其林,一个与倍耐力,都为B & o音频系统。我的问题;假设再次打电话给该订单添加项目到购物篮,例如,另一个与米其林和奥迪奥迪& 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 

。我猜我需要将它聚合起来,并有一个计数= 2,但只是不能解决。任何人都可以帮助我更聪明吗?

(只是为了增加,数据库在现实生活中正常化,但为了清晰起见,我只有全文文本值)。

回答

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,其中选项= '米什兰' 或选项= 'B & O'

+0

啊哈,谢谢,只是需要加入具有n = 2,我得到了我以后的ID,因为我只想要它有两个指定选项的ID。 – BigMeat 2014-11-08 14:50:47

相关问题