我有两张桌子:
Message:
id: INT
created_at: DATETIME
Comment:
id: INT
message_id: INT
created_at: DATETIME
一个Message
有很多Comments
。
我想通过最近的活动获得所有Messages
订单:
Message
有Comments
,则最新Comment
的{{1}}用作created_at
活动指标Message
没有Message
,那么Comments
值就是活动指标基本上,我想把它分类为经典的电子邮件或私人消息系统。
也许我可以created_at
评论,但我认为没有必要仅仅为了排序而获得所有评论。
此外,我考虑在INNER JOIN
中创建一个列来保存上一个活动日期,并在创建Message
时更新它,但我想看看你是否有更好的解决方案..
我正在使用Doctrine,所以如果你有一个基于Doctrine的解决方案,我宁愿这样做,
谢谢!
答案 0 :(得分:1)
我在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
答案 1 :(得分:1)
尝试这样的事情:
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的案例语法。
答案 2 :(得分:0)
如果您的评论表的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