首页 > 解决方案 > MySQL JOIN 用于对具有一对多关系的表进行排序

问题描述

我可能需要一些帮助,我的 SQL 知识足以应付但并不令人惊讶,我会尽可能简单地分解它。

我想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但按最高移动日期排序。

我很高兴发布表格结构和任何其他相关信息,并对我的帖子进行编辑以使其更加清晰。

标签: mysql

解决方案


方法一:

你可以Group Byorderno球场上;这将导致每个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

补充说明:


方法二:

我们可以使用相关子查询并获取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

推荐阅读