[英]MySQL JOIN for sorting a table with a 1 to many relationship
我在這里可能需要一些幫助,我的SQL知識足以應付,但並不令人驚訝,我將盡可能簡單地分解它。
orders
和shippers
orders
有很多shippers
,由orderno
列關聯 shippers
有一個move_dt
列(要發貨的日期/時間) 我想按shippers
表格中最高的move_dt
排序orders
。
換句話說:我想按發貨日期/時間列出訂單,並且只顯示每個訂單一次。
此查詢為我提供了多個訂單實例,每個實例針對其擁有的每個托運人:
select `orders`.*, `shippers`.`move_dt` from `orders`
join `shippers` on `shippers`.`orderno` = `orders`.`orderno`
order by `shippers`.`move_dt` desc
我需要做什么,所以每個訂單只能顯示一次? 該查詢應返回與select * from orders
相同數量的結果,但按托運人表中的最高移動日期排序。
我很高興發布表結構和任何其他相關信息,並對我的帖子進行編輯以使其更加清晰。
方法1:
你可以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
補充筆記:
Select *
; 總是喜歡使用要獲取的列的名稱。 閱讀: 為什么SELECT *被認為有害? Group By
,我們需要確保Select
子句中指定的所有列/表達式都是聚合表達式,或者是Group By
子句中指定的列/表達式。 請閱讀: SELECT列表不在GROUP BY子句中,並且包含未聚合的列....與sql_mode = only_full_group_by不兼容 方法二:
我們可以使用相關子查詢並獲取訂單的最大move_dt
值。 這將消除“ Group by
”和“ Join
要求。 現在,您可以在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.