独家mysql选择查询,两个表

时间:2012-04-16 14:40:36

标签: mysql sql

我有以下表格(他们都有更多专栏,但我只是展示了感兴趣的专栏):

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但是当我有两个像我这样的表时,我无法掌握该查询。我只需要另一双眼睛来帮助我! :)

你对我将如何做到这一点有任何想法吗?

编辑:要清除,我想获取仅包含来自一个或多个指定供应商的产品的所有订单。不应包括与指定的其他供应商的产品订单。

3 个答案:

答案 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