mysql join用于对具有1对多关系的表进行排序

c86crjj0  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(276)

在这里我可能需要一些帮助,我的sql知识足以应付,但并不令人惊讶,我会尽可能简单地分解它。
我有两张table: orders 以及
shippers orders 有很多 shippers ,由 ordernoshippers 有一个 move_dt 列(订单发货的日期/时间)
我要分类 orders 最高的 move_dtshippers table。
换句话说:我想按发货日期/时间列出订单,并且每个订单只显示一次。
此查询为我提供多个订单示例,每个发货人对应一个:

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

我需要做什么,使每个订单只显示一次?查询返回的结果数应与 select * from orders 但必须按发货人表中的最高移动日期排序。
我很高兴张贴表结构和任何其他相关信息,并有编辑我的职位,使它更清楚。

7vhp5slm

7vhp5slm1#

方法1:
你可以 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

附加说明:
不要使用 Select * ; 总是喜欢使用要获取的列的名称。阅读:为什么选择*被认为是有害的?
使用时 Group By ,我们需要确保 Select 子句可以是聚合表达式,也可以是 Group By 条款。do read:选择列表不在group by子句中,并且包含未聚合的列。。。。与sql不兼容\u mode=only \u full \u group by
处理多表查询时,建议使用别名。
方法2:
我们可以使用相关子查询并获取最大值 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

相关问题