2011-08-24 56 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的大小寫語法。