2011-08-24 57 views
1

我有2个表:为了通过一个一对多的关系

Message: 
    id:   INT 
    created_at: DATETIME 

Comment: 
    id:   INT 
    message_id: INT 
    created_at: DATETIME 

一个Message有很多Comments

我想通过最近的活动来获取所有Messages顺序:

  • 如果MessageComments,那么最近Commentcreated_at用作Message活动的指标
  • 如果Message没有按' t有Comments,这是created_at值是活动指标

因此,基本的Ÿ,我想将它排成一个经典的电子邮件或私人消息系统。

也许我可以INNER JOIN评论,但我不认为有必要得到所有的评论只是为了排序。

而且,我想到了在Message创建一个列保存上次活动日期和更新每当创建一个Comment,但我想看看是否有更好的解决方案..

我使用Doctrine,所以如果你有一个基于Doctrine的解决方案,我宁愿那,

谢谢!

+0

哪个版本? 1.2或2.0(或2.1,但我怀疑这是重要的) – adlawson

+0

版本1.2 ... – tamir

回答

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 
+0

对不起,我的意思是'GREATEST()'。编辑。 –

+0

唯一的问题是,如果没有评论,SELECT将返回null,因此,GREATEST也会返回null,并将所有未评论的消息推送到列表中。 – tamir

+0

尝试此: 'SELECT * FROM 消息AS米 ORDER BY GREATEST( m.created_at, IFNULL((SELECT MAX(c.created_at)FROM注释AS C,其中c.message_id = m.id),” 0000-00-00') )DESC' 这将假设'Messages.created_at'总是有一个值,我认为它有。 –

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 
+0

但这只会选择记录,其中b.created_at> a.created_at,如果没有b(评论)消息? – tamir

+0

你是对的。我以为你只对语法顺序感兴趣。不过,我认为你可以分两步做,一个子查询,或者使用ifs。看起来其他一些答案更具描述性和完整性。 –

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的大小写语法。