這是怎麼回事?
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',那麼您可以使用該列進行排序。如果您必須動態確定郵件是領導者還是追隨者,則您必須加倍努力。
MySQL沒有分層/遞歸查詢支持 – 2010-09-15 02:21:50
因此,例如像reddit或youtube這樣的站點如何回覆分組,那麼必須有一種方法可以用mysql來實現...也許不是我建議的方式我應該試試 – Scarface 2010-09-15 02:26:45