2010-09-15 68 views
0

嘿傢伙,快問。我有一張消息表。mysql分組問題

有兩種類型的消息:

  • 消息與一組獨特的ID
  • 自主消息

消息與同組ID至少一個其它消息 - 這些我想當他們被提出時團結在一起。分組消息是帶有答覆的消息。我想要做的是創建一個查詢,以便將分組消息放在一起,而不管輸入回覆的時間,該組的最早/根消息將與其餘消息按時間順序相關。

我目前的查詢是這樣的,顯然只是按照時間順序對消息進行排序。

SELECT timestamp, 
     user, 
     message, 
     group_id 
    FROM messages 
    WHERE topic_id = ? 
ORDER BY timestamp DESC 
    LIMIT 10 

有沒有人有任何建議?

+0

MySQL沒有分層/遞歸查詢支持 – 2010-09-15 02:21:50

+0

因此,例如像reddit或youtube這樣的站點如何回覆分組,那麼必須有一種方法可以用mysql來實現...也許不是我建議的方式我應該試試 – Scarface 2010-09-15 02:26:45

回答

2

這是怎麼回事?

SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp 
    FROM messages AS m JOIN 
     (SELECT group_id, MIN(timestamp) AS grp_timestamp 
      FROM messages 
     GROUP BY group_id) AS g ON m.group_id = g.group_id 
WHERE m.topic_id = ? 
ORDER BY g.grp_timestamp, g.group_id, m.timestamp; 

的邏輯是由組時間戳排序首先識別的最早時間戳在子查詢中的每個GROUP_ID(假定沒有響應具有有效GROUP_ID分配消息),然後,再由組ID(因此如果兩個組以某種方式結束了相同的時間戳,那麼這些消息仍然是正確排序的),然後是消息時間戳。

您可能還想將WHERE子句推入子選擇。


如果您想要最近的消息,那麼基本上,您將DESC應用於適當位置的ORDER BY子句。

SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp 
    FROM messages AS m JOIN 
     (SELECT group_id, MIN(timestamp) AS grp_timestamp 
      FROM messages 
     GROUP BY group_id) AS g ON m.group_id = g.group_id 
WHERE m.topic_id = ? 
ORDER BY g.grp_timestamp DESC, g.group_id, m.timestamp DESC; 

您可能希望具有最近響應的組首先出現;在這種情況下,你需要從MIN聚合調整MAX:

SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp 
    FROM messages AS m JOIN 
     (SELECT group_id, MAX(timestamp) AS grp_timestamp 
      FROM messages 
     GROUP BY group_id) AS g ON m.group_id = g.group_id 
WHERE m.topic_id = ? 
ORDER BY g.grp_timestamp DESC, g.group_id, m.timestamp; 

只要你是出現在時間順序應答OK,我覺得做的伎倆。如果答覆必須按照時間順序倒序顯示,並且原始消息首先出現,則會遇到一些困難。如果您在消息表中將消息標記爲'L'代表'leader'和'F'代表'follower',那麼您可以使用該列進行排序。如果您必須動態確定郵件是領導者還是追隨者,則您必須加倍努力。

+0

首先,非常感謝你的時間喬納森。它似乎工作,因爲該組被分組,並且該組本身按照正確的時間順序,但是我想通過使用desc或asc來反轉組內結果的順序,我將如何使用此查詢來做到這一點? – Scarface 2010-09-15 03:03:12

+0

喬納森頗有史詩般的迴應。我非常感謝你的努力和時間幫助我解決這個問題,並在解釋解決問題的可能性方面做出超越和超越。再次感謝。 – Scarface 2010-09-15 03:34:58