mysql - MySQL JOIN 用于对具有一对多关系的表进行排序
问题描述
我可能需要一些帮助,我的 SQL 知识足以应付但并不令人惊讶,我会尽可能简单地分解它。
- 我有两张桌子:
orders
和shippers
orders
有很多shippers
,按orderno
列相关shippers
有一个move_dt
列(订单发货的日期/时间)
我想orders
按表中最高move_dt
的排序shippers
。
换句话说:我想按发货日期/时间列出订单,并且每个订单只显示一次。
此查询为我提供了多个订单实例,每个发货人都有一个:
select `orders`.*, `shippers`.`move_dt` from `orders`
join `shippers` on `shippers`.`orderno` = `orders`.`orderno`
order by `shippers`.`move_dt` desc
我需要做什么才能使每个订单只显示一次?该查询应返回与托运人表中的最高移动日期相同数量的结果,select * from orders
但按最高移动日期排序。
我很高兴发布表格结构和任何其他相关信息,并对我的帖子进行编辑以使其更加清晰。
解决方案
方法一:
你可以Group By
在orderno
球场上;这将导致每个orderno
. 然后,您可以使用Max()
聚合函数来获取move_dt
订单的最大值。最终,您可以根据最大值对结果进行排序move_dt
。
select o.orderno, -- you can add more columns here from orders table
MAX(s.move_dt) AS max_move_dt
from orders AS o
join shippers AS s on s.orderno = o.orderno
group by o.orderno -- ensure to add extra column from select clause here also
order by max_move_dt desc
补充说明:
- 不要使用
Select *
;总是更喜欢使用要获取的列的名称。请阅读:为什么 SELECT * 被认为是有害的? - 使用时
Group By
,我们需要确保Select
子句中指定的所有列/表达式要么是聚合表达式,要么是子句中指定的列/表达式Group By
。请阅读:SELECT 列表不在 GROUP BY 子句中并且包含非聚合列 .... 与 sql_mode=only_full_group_by 不兼容 - 建议在处理多表查询时使用别名。
方法二:
我们可以使用相关子查询并获取move_dt
订单的最大值。这将取消Group by
, 和Join
要求。现在,您可以在子句中指定orders
表中的所有列Select
,而不必担心在Group By
子句中指定它们:
select o.*,
(SELECT MAX(move_dt)
FROM `shippers` AS s
WHERE s.orderno = o.orderno) AS max_move_dt
from `orders` AS o
order by max_move_dt desc
推荐阅读
- xaml - XML 命名空间“using:Microsoft.Xaml.Interactions.Core”中不存在标记“EventTriggerBehavior”
- python - werkzeug 模块与散列密码不匹配
- excel - 将 SPSS 数据保存到 Excel 中的现有工作表(替换)创建新工作表
- linux - Apache 站点在升级到 2.4 后无法工作
- java - 通过单击按钮从 TextField 获取数据并插入数据库
- c - malloc(0) 返回地址而不是 NULL 是什么?这个地址是什么意思
- node.js - Typeorm querybuilder update 获取更新结果
- hybris - Hybris 为 PointOfService 定义产品价格
- node.js - 节点针同步等待承诺不起作用
- r - 如何用R中以前的非零数据行填充缺失的数据行?