2010-09-15 64 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