首页 > 解决方案 > 跨多个表的MYSQL中的多个列分组(INNER JOIN)

问题描述

我在摆弄 w3schools 北风 DB。 https://www.w3schools.com/sql/trymysql.asp?filename=trysql_func_mysql_count

我试图完成的事情:这样的结果:

orderid       suppliername                   numberOfProducts
10300         New Orleans Cajun Delights                    2

这里的问题是:相应的订单实际上需要两个不同的供应商。这没有反映在我的查询结果中。

这是查询:

SELECT  o.orderid, s.suppliername, COUNT(p.productname) AS numberOfProducts
FROM Suppliers s
JOIN Orders o
ON o.shipperid = s.supplierid
JOIN OrderDetails od
ON od.orderid = o.orderid
JOIN Products p 
ON p.productid = od.productid
GROUP BY o.orderid, s.suppliername
HAVING o.orderid = 10300;

我比较困惑。据我所知,在 mysql 中可以按多列分组: SELECT 子句中不存在聚合函数时的 GROUP BY 行为

“优先级”在 GROUP BY 子句中从左到右进行。因此,在上述查询中,我期望以下行为:

首先,将列的尽可能多的相同结果集分组O.OrderID到一行中。其次,将列中尽可能多的相同结果归为S.SupplierName一行。对于每个结果行,聚合列的结果集数P.ProductName

但目前,它只完成了一半的工作。它基本上忘记相应地对列的各个结果集进行分组S.SupplierName。所以在这里我只看到一个供应商为这个订单提供了 2 件产品,而实际上是两个供应商,每个供应商都为我们提供了一个订单的产品。

我错过了什么?

标签: mysqldatabaserelational-database

解决方案


你的倒数第二段是错误的。如果你运行这个

SELECT  o.orderid,suppliername,p.productname
FROM Suppliers s
JOIN Orders o
ON o.shipperid = s.supplierid
JOIN OrderDetails od
ON od.orderid = o.orderid
JOIN Products p 
ON p.productid = od.productid
where o.orderid = 10300

这里https://www.w3schools.com/sql/trymysql.asp?filename=trysql_func_mysql_count

你明白了

orderid suppliername                productname
10300   New Orleans Cajun Delights  Louisiana Hot Spiced Okra
10300   New Orleans Cajun Delights  Scottish Longbreads

所以查询的输出是正确的,结果中应该只产生一行


推荐阅读