MySQL JOIN 用于对具有一对多关系的表进行排序

Wes*_*rch 4 mysql

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

  • 我有两个表:ordersshippers
  • orders有很多,按列shippers相关orderno
  • shippers有一个move_dt列(订单发货的日期/时间)

我想按表中orders最高的排序。move_dtshippers

换句话说:我想按发货日期/时间列出订单,并且每个订单仅显示一次。

此查询为我提供了多个订单实例,每个发货人对应一个订单实例:

select `orders`.*, `shippers`.`move_dt` from `orders`
join `shippers` on `shippers`.`orderno` = `orders`.`orderno`
order by `shippers`.`move_dt` desc
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能让每个订单只显示一次?该查询应返回与发货人表中的最高移动日期相同数量的结果,但select * from orders按发货人表中的最高移动日期排序。

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

Mad*_*iya 5

方法一:

你可以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
Run Code Online (Sandbox Code Playgroud)

补充笔记:


方法二:

我们可以使用相关子查询并获取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
Run Code Online (Sandbox Code Playgroud)

  • @DanielBlais 这就是OP所说的:“我需要做什么才能让每个订单只显示一次?” (2认同)
  • 非常感谢!我必须离开工作一段时间,但这似乎正是我所需要的,非常感谢先生!当我回来时,我会阅读相关链接。 (2认同)
  • @DanielBlais 关心删除反对票:) OP 已标记为已接受,因为这是他最初想要的:) (2认同)