簡體   English   中英

MySQL JOIN用於對具有一對多關系的表進行排序

[英]MySQL JOIN for sorting a table with a 1 to many relationship

我在這里可能需要一些幫助,我的SQL知識足以應付,但並不令人驚訝,我將盡可能簡單地分解它。

  • 我有兩個表: ordersshippers
  • 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 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

補充筆記:


方法二:

我們可以使用相關子查詢並獲取訂單的最大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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM