【问题标题】:sql query to display products that have not been ordered/appear on invoicesql查询显示尚未订购/出现在发票上的产品
【发布时间】:2018-10-05 11:33:17
【问题描述】:

我有一个家庭作业问题,我遇到了一些麻烦。我被问到我们数据库中从未售出的产品总数。

应该是这样的:

+--------------------------------------------+
| number of products that have not been sold |
+--------------------------------------------+
|                                        228 |
+--------------------------------------------+

我不断收到这个:

+--------------------------------------------+
| number of products that have not been sold |
+--------------------------------------------+
|                                          0 |
+--------------------------------------------+

我的查询是:

SELECT count(*) AS 'number of products that have not been sold'  
FROM orderdetail  
JOIN invoice on invoice.invoiceid=orderdetail.invoiceid  
WHERE productid is null;

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    • 由于您要考虑所有产品,product 表必须是您在加入中的起始表。
    • 左连接,而不是内连接。否则,Inner Join 将消除没有匹配订单行可用的所有产品。
    • 使用ProductID 加入orderDetail
    • 要统计所有没有订单的产品,请使用COUNT() 函数

    尝试以下方法:

    SELECT count(p.ProductID) AS 'number of products that have not been sold'  
    FROM product AS p   
    LEFT JOIN orderDetail AS od ON od.ProductID = p.ProductID  
    WHERE od.productid IS NULL
    

    【讨论】:

    • 我似乎仍然总共得到 0。我还必须提到产品 ID 来自 1、2、5、6、7、8、10、12 等,因此缺少一些产品 ID列。
    • @cybkty 要获取产品 ID,您可以删除 COUNT(DISTINCT p.productID) 并简单地使用 p.productID
    • @cybkty 你确定在orderdetail 表中有一些productid 没有匹配的行吗?
    • 假设ProductIDproduct的主键,则不需要DISTINCT,因为不能重复。
    • 而且不需要COUNT(p.ProductID),只需使用COUNT(*)
    【解决方案2】:

    你可以试试这个:leftjoin on product而不是orderdetail:

    SELECT count(p.productid)
    FROM product as p
    LEFT JOIN orderdetail as oDetail on p.productid = oDetail.productid
    WHERE oDetail.productid IS NULL;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多