按一对多关系排序

时间:2011-08-24 18:44:49

标签: mysql doctrine sql-order-by foreign-key-relationship

我有两张桌子:

Message:
    id:         INT
    created_at: DATETIME

Comment:
    id:         INT
    message_id: INT
    created_at: DATETIME

一个Message有很多Comments

我想通过最近的活动获得所有Messages订单:

  • 如果MessageComments,则最新Comment的{​​{1}}用作created_at活动指标
  • 如果Message没有Message,那么Comments值就是活动指标

基本上,我想把它分类为经典的电子邮件或私人消息系统。

也许我可以created_at评论,但我认为没有必要仅仅为了排序而获得所有评论。

此外,我考虑在INNER JOIN中创建一个列来保存上一个活动日期,并在创建Message时更新它,但我想看看你是否有更好的解决方案..

我正在使用Doctrine,所以如果你有一个基于Doctrine的解决方案,我宁愿这样做,

谢谢!

3 个答案:

答案 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