mysql - 跨多个表的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 件产品,而实际上是两个供应商,每个供应商都为我们提供了一个订单的产品。
我错过了什么?
解决方案
你的倒数第二段是错误的。如果你运行这个
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
所以查询的输出是正确的,结果中应该只产生一行
推荐阅读
- input - anychart line - xScale 限制输入数据 + 偏移量
- android - deeplink 在使用导航组件时发送不完整的序列化参数
- swift - Swift:闭包如何捕获值类型的变量?
- sql - 将行值转换为列值
- php - OOP 中的准备好的语句
- android - NavController.getBackStackEntry() 按预期工作
- wordpress - 如何以编程方式创建 WooCommerce 预订?
- python - 在 django 上使用 xlsxwriter 创建的 excel 文件上删除 .xls 扩展名
- assembly - 解决汇编中两个数相加的练习
- python - 处理熊猫中的重复值