[英]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
:
Message
有Comments
,則最新Comment
的created_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.