我有以下表格(他们都有更多专栏,但我只是展示了感兴趣的专栏):
Product Order details Orders
---------------------------- ---------------------------- --------------
| id_product | id_supplier | | id_order | id_product | | id_order |
| 12 | 2 | | 1 | 56 | | 1 |
| 32 | 4 | | 2 | 32 | | 2 |
| 56 | 2 | | 2 | 56 | | 3 |
| 10 | 1 | | 4 | 56 | | 4 |
---------------------------- | 3 | 12 | --------------
----------------------------
我想要做的是选择所有包含来自仅一个或多个供应商的产品的订单。所以我想说我希望所有订单只有供应商的产品ID为2(id_supplier = 2)我应该得到ID为1,3和4的订单。
如果我希望仅的所有订单都来自供应商的产品,其ID为4(id_supplier = 4),我应该得到一个空的结果。
如果我希望仅的所有订单都来自ID为 AND 4的供应商的产品,我应该收到ID为2的订单。
我已经阅读了以下问题:mySQL exclusive records但是当我有两个像我这样的表时,我无法掌握该查询。我只需要另一双眼睛来帮助我! :)
你对我将如何做到这一点有任何想法吗?
编辑:要清除,我想获取仅包含来自一个或多个指定供应商的产品的所有订单。不应包括与指定的其他供应商的产品订单。
答案 0 :(得分:1)
根据我列出的问题,我认为这就是你想要的,可以通过LEFT加入完成。
select
od.id_order,
sum( if( p.id_supplier in ( 2, 4 ), 1, 0 )) as HasSupplierLookingFor,
sum( if( p.id_supplier in ( 2, 4 ), 0, 1 )) as HasOtherSuppliers
from
order_Details od
join product p
on od.id_product = p.id_product
group by
od.id_order
having
HasSupplierLookingFor > 0
AND HasOtherSuppliers = 0
有时,只是回答一个可能有点含糊不清的问题会导致错误的答案。此查询将按订单进行,加入产品以按订单ID查找供应商和分组。
对于每个订购的产品,第一个SUM()询问它是否是您正在寻找的供应商之一,如果是,则将值加1,否则为0 ...下一个SUM()询问相同的事情。但如果它是供应商,则使用零,因此所有其他供应商都获得1。
所以,现在,HAVING条款正在寻找至少有1个供应商合格并且没有其他供应商代表的任何订单。
因此,您可以订购30件商品,20件来自供应商2,10件来自供应商4.HasSupplierLookingFor = 30,HasOtherSuppliers = 0,订单将包括在内。
另一个订单可能有5个项目。一个来自供应商2,另外四个来自供应商9.这将有HasSupplierLookingFor = 1,HasOtherSuppliers = 4,因此将其排除为合格订单。
答案 1 :(得分:0)
你应该内连接所有这些表,如下所示:
SELECT o.* from Orders o
INNER JOIN Details d ON o.id_order = d.id_order
INNER JOIN Products p ON d.id_product = p.id_product
WHERE p.id_supplier = 4
这将为您提供包含该供应商产品的订单。
答案 2 :(得分:0)
SELECT o.id_order
FROM Orders o
INNER JOIN `Order details` od
ON o.id_order = od.id_order
INNER JOIN Product p
ON p.id_product = od.id_product
WHERE p.id_supplier IN (2,4)
(2,4)是您要获取的供应商。你也可以通过说(2)
只要求1