在多个表中按 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 上的友好用户帮助了我 :)
我正在摆弄 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 上的友好用户帮助了我 :)