这是怎么回事?
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