问题:每个客户的名称,他们下了多少订单,以及他们订购了多少个比萨饼?
这就是我所拥有的:
client.storeFile(" /c/"+file.getName(), fis)
这就是它打印的内容:
订单数量错误,应为1-0-2-1。
当我从“Orders.ID = Pizza.OrderID”更改为“Pizza.OrderID = Orders.ID”时,它将打印出两列的订单数量,而不是两列的比萨数量。
我该如何解决这个问题?
答案 0 :(得分:1)
看起来你正在上课和学习,所以我有一些额外的反馈给你。首先,如果要将表格连接在一起,最好完全限定您选择的每个字段,即使它仅对单个表格是唯一的(例如FirstName
变为c.FirstName
)。它有助于自我记录您的代码。
其次,如果不同意的话,在多个表中使用一个名称相同的字段是不好的做法。具体而言,Customer.ID
应为Customer.CustomerID
,Order.ID
应为Order.OrderID
。同样,这有助于自我不仅记录您的查询,而且还记录在您之后必须使用这些表的所有其他开发人员。 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
答案 1 :(得分:0)
将其更改为count(distinct orders.id)