在多个表中按 MYSQL 中的多列分组(INNER JOIN)

Grouping by multiple columns in MYSQL across multiple tables (INNER JOIN)

我正在摆弄 w3schools northwind 数据库。 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 中可以按多列分组: GROUP BY behavior when no aggregate functions are present in the SELECT clause

"priorization" 在 GROUP BY 子句中从左到右。所以在上面的查询中,我希望有以下行为:

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

的结果集数

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

我错过了什么?

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

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

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

我自己找到了答案:

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

主要问题是 ON o.shipperid = s.supplierid 必须 ON s.supplierid = p.supplierid

SO 上的友好用户帮助了我 :)