小编典典

SQL查询线程消息

sql

我的网站具有消息传递功能,一个用户可以向另一个用户发送消息。消息支持线程处理-父消息可以具有任意数量的子代,但只有一层深。

消息表如下所示:

Messages
 - Id (PK, Auto-increment int)
 - UserId (FK, Users.Id)
 - FromUserId (FK, Users.Id)
 - ParentMessageId (FK to Messages.Id)
 - MessageText (varchar 200)

我想在页面上显示每个“父”消息的消息,然后是子消息的折叠视图。

我可以使用GROUP
BY子句或类似的构造在一个查询中检索父消息和子消息吗?现在,我只检索父消息,然后遍历它们,并对每个父消息执行另一个查询,以获取所有相关的子消息。

我想得到这样的消息:

Parent1
 Child1
 Child2
 Child3
Parent2
 Child1
Parent3
 Child1
 Child2

阅读 180

收藏
2021-05-16

共1个答案

小编典典

您可以使用临时ID来订购消息。如果消息是父项,则临时ID将等于该ID,否则该临时ID将等于ParentMessageID。然后,您只需要按临时ID订购

SELECT Messages.*, 
CASE WHEN ParentMessageId IS NULL THEN Id ELSE ParentMessageId END AS tempId 
FROM Messages
ORDER BY tempId

编辑

如果您想要前10条记录,则可以先获取ID,然后运行查询

SELECT Messages.*, 
CASE WHEN ParentMessageId IS NULL THEN Id ELSE ParentMessageId END AS tempId 
FROM Messages
WHERE Messages.tempId IN (SELECT Messages.Id 
                      FROM Messages
                      WHERE ParentMessageId IS NULL
                      LIMIT 10
                      ORDER BY Messages.Id )
ORDER BY tempId

这样,您只能从前10条消息中获取消息和相应的子项。

2021-05-16