In this Database我想计算只包含特定类别产品的订单数量。
我知道如何计算所有订单,其中也包含特定类别的项目,即类别1:

SELECT Count(DISTINCT orderdetails.orderid) AS "AllCat1"
FROM   orderdetails
       INNER JOIN orders
               ON orderdetails.orderid = orders.orderid
                  AND orderdetails.productid IN (SELECT DISTINCT productid
                                                 FROM   products
                                                 WHERE  categoryid = 1)
WHERE  orderdate BETWEEN "1996-12-01" AND "1996-12-31";

我很难找到一个优雅的方法来获得所有只包含1类物品的订单。我尝试选择所有orderid并按orderid和categoryid对它们进行分组:
SELECT *
FROM   orderdetails
       INNER JOIN orders
               ON orderdetails.orderid = orders.orderid
                  AND orderdate BETWEEN "1996-12-01" AND "1996-12-31"
       INNER JOIN products
               ON orderdetails.productid = products.productid
GROUP  BY orderdetails.orderid,
          categoryid;

但我不知道如何计算所有只包含类别1项的orderid。我的方法对吗?或者有更好的方法来做吗(我确信有)

最佳答案

您可以使用HAVING子句进行筛选。我们基本上计算订单明细行,其中一个订单的类别为1。它应该等于该顺序的行总数。这将确保一个顺序中的所有类别仅为1。

SELECT od.orderid
FROM   orderdetails AS od
       INNER JOIN orders AS o
               ON od.orderid = o.orderid
                  AND o.orderdate BETWEEN "1996-12-01" AND "1996-12-31"
       INNER JOIN products AS p
               ON od.productid = p.productid
GROUP  BY od.orderid
HAVING COUNT(CASE WHEN p.categoryid = 1 THEN 1 END) = COUNT(*)

建议在多表查询的情况下使用Aliasing,以提高代码的清晰度和可读性。

关于mysql - SQL获取仅包含一种 Material 的所有订单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53430760/

10-11 22:11
查看更多