0

我有以下表格(它们都有更多的列,但我只是显示感兴趣的列):

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 为 24 的供应商的产品的订单,我应该得到 id 为 2 的订单。

我已经阅读了以下问题:mySQL 独占记录,但是当我有两个像我这样的表时,我无法掌握该查询的工作原理。我只需要另一双眼睛来帮助我!:)

你知道我会怎么做吗?

编辑:为了明确起见,我想获取仅包含来自一个或多个指定供应商的产品的所有订单。不包括指定的其他供应商的产品订单。

4

3 回答 3

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,另外 4 个来自供应商 9。这将具有 HasSupplierLookingFor = 1 和 HasOtherSuppliers = 4,因此将其排除为合格订单。

于 2012-04-16T15:33:30.850 回答
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

这将为您提供包含该供应商产品的订单。

于 2012-04-16T14:47:48.127 回答
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

于 2012-04-16T14:48:19.173 回答