我可能需要一些帮助,我的 SQL 知识足以应付,但并不令人惊奇,我会尽可能简单地将其分解。
orders和shippersorders有很多,按列shippers相关ordernoshippers有一个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按发货人表中的最高移动日期排序。
我很高兴发布表格结构和任何其他相关信息,并对我的帖子进行编辑以使其更加清晰。
方法一:
你可以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)
补充笔记:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |