簡體   English   中英

按一對多關系排序

[英]Order by one-to-many relation

我有2張桌子:

Message:
    id:         INT
    created_at: DATETIME

Comment:
    id:         INT
    message_id: INT
    created_at: DATETIME

一條Message有許多Comments

我想獲取按最近活動排序的所有Messages

  • 如果MessageComments ,則最新Commentcreated_at用作Message活動指示器
  • 如果Message沒有Comments ,它的created_at值是活動指示器

所以基本上,我想像經典的電子郵件或私人消息系統一樣對其進行排序。

也許我可以INNER JOIN評論,但我認為沒有必要為排序獲取所有評論。

另外,我想在Message創建一個列來保存上次活動日期並在創建Comment時更新它,但我想看看您是否有更好的解決方案..

我正在使用 Doctrine,所以如果你有一個基於 Doctrine 的解決方案,我寧願這樣,

謝謝!

我會在 MySQL 中做的事情是這樣的:

SELECT *
FROM Messages AS m
ORDER BY GREATEST(
   m.created_at, 
   (SELECT MAX( c.created_at ) FROM Comment AS c WHERE c.message_id = m.id )
) DESC 

嘗試這樣的事情:

select m.message_id, c.created_at, m.created_at 
from message m
left join (
    select message_id, MAX(created_at) as created_at
    from comment
    group by message_id
) c on m.id = c.message_id
order by 
    ( case when c.created_at >= m.created_at then c.created_at
          else m.created_at
     end ) desc

子查詢將獲取每條消息的最新評論日期,然后消息表將外部加入子查詢,因為某些消息可能根本沒有任何評論。 然后按評論創建日期和消息創建日期的較大值排序。

您可能需要更改 mysql 的大小寫語法。

如果您的評論表的 id 是自動增加的,您可以簡單地按 id desc 排序,只要您不在評論表上進行刪除操作,它就會按時間順序返回結果時間順序。 否則,您需要執行以下操作:

SELECT a.id, a.created_at 
FROM Message a, Comment b 
WHERE b.created_at > a.created_at 
ORDER BY b.created_at DESC 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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