gpt4 book ai didi

mysql - 聚合 SQL 查询

转载 作者:行者123 更新时间:2023-11-28 23:14:17 26 4
gpt4 key购买 nike

问题:每位顾客的姓名是什么,他们下了多少订单,他们订购了多少披萨?

enter image description here

这是我的:

SELECT DISTINCT FirstName, LastName, Count(Orders.ID) AS NumberOfOrders, Count(Pizza.ID) AS NumberOfPizzas 
FROM ((Customer LEFT OUTER JOIN Orders ON Customer.ID = Orders.CustomerID) LEFT OUTER JOIN Pizza ON Orders.ID = Pizza.OrderID) GROUP BY Customer.ID;

这是它打印的内容:

enter image description here

订单数错了,应该是1-0-2-1。

当我从“Orders.ID = Pizza.OrderID”更改为“Pizza.OrderID = Orders.ID”时,它将打印出两列的订单数,而不是两列的比萨饼数。

我该如何解决这个问题?

最佳答案

看起来你正在上课学习,所以我有一些额外的反馈给你。首先,如果您将表连接在一起,最好完全限定您选择的每个字段,即使它只对一个表是唯一的(例如 FirstName 变成 c.FirstName).它有助于 self 记录您的代码。

其次,如果一个字段在多个表中的名称不同,那么它是不好的做法。具体来说,Customer.ID 应该是 Customer.CustomerIDOrder.ID 应该是 Order.OrderID。同样,这不仅有助于 self 记录您的查询,而且可以帮助您之后必须使用这些表的所有其他开发人员。该 ID 字段代表的内容更加清晰。

连接(至少在 MySQL 中)不必全部用括号括起来。在不必要的情况下这样做可能会导致令人沮丧的拼写错误,并使您和其他人更难阅读。

最后,对于 99% 的情况,您应该始终在最终产品中使用 ORDER BY 子句,因为您永远不能依赖程序按您的预期返回结果。为用户选择合乎逻辑的东西。在这种情况下,先按 LastName 然后按 FirstName 排序非常直观。不要做惹恼用户的事情!

现在,针对您的具体问题,这非常简单。您需要在查询中使用 COUNT(DISTINCT ...)。考虑到以上所有因素,我对您的查询进行了重新排序以提高其可读性。希望对您有所帮助!

SELECT c.FirstName, c.LastName, COUNT(DISTINCT o.id) AS NumberOfOrders,
COUNT(p.ID) AS NumberOfPizzas
FROM Customer c
LEFT JOIN Order o ON o.CustomerID = c.ID
LEFT JOIN Pizza p ON p.OrderID = o.ID
GROUP BY c.ID
ORDER BY c.LastName, c.FirstName

关于mysql - 聚合 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44556604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com