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

标签 mysql

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

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

我想按 shippers 表中最高的 move_dtorders 进行排序。

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

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

select `orders`.*, `shippers`.`move_dt` from `orders`
join `shippers` on `shippers`.`orderno` = `orders`.`orderno`
order by `shippers`.`move_dt` desc

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

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

最佳答案

方法一:

您可以在 orderno 字段上Group By;这将导致每个 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

附加说明:


方法 2:

我们可以使用 Correlated Subquery并获取订单的最大 move_dt 值。这将消除 Group byJoin 要求。现在,您可以在 Select 子句中指定 orders 表中的所有列,而不必担心在 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

关于MySQL JOIN 用于对具有一对多关系的表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160184/

相关文章:

mysql - MySQL 设计中的多行与逗号分隔列

mysql - 子子查询无法访问在外部范围内定义的表

python - 向 MySQL 添加信息不起作用

php - 获取带有表名的结果标题

php - 如何使用 PHP 和 AJAX 显示 MySQL 数据库

php - sql查询不会发送到数据库php

mysql - 将日期转换为配置单元中的时间戳

mysql - 如何在Access 2007中创建多字段查询?

python - (Python 3.6.1) Pandas df 到 MySQL 数据库错误, 'ModuleNotFoundError: No module named ' MySQLdb'

mysql - 如何添加引用同一个表的主键的外键约束(自引用)