PostgreSQL在移动到下一条消息之前获取每条消息及其所有回复

ryevplcw  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(136)

我有一个messages表,值如下:
replyto字段中的值表示该消息是对另一个具有id的消息的回复。
| ID|消息|来自用户|图泽|ReplyTo|删除|时间|
| --|--|--|--|--|--|--|
| 1 |MSG1| user1| user2| 1 | 0 |T1|
| 2 |MSG2| user2| user1| 2 | 0 |T2|
| 3 |MSG3| user2| user1| 1 | 0 |T3|
| 4 |MSG4| user2| user1| 1 | 0 |T4|
| 5 |MSG5| user2| user1| 1 | 0 |T5|
| 6 |msg6| user1| user2| 2 | 0 |T6|
| 7 |MSG7| user2| user1| 7 | 0 |T7|
| 8 |msg8| user2| user1| 7 | 0 |T8|
我想获取和显示所有用户的消息,同时显示每个消息和所有它的答复,在replyto中找到之前,我显示下一个消息。
邮件必须以降序显示,并且必须从users表中获取发件人的详细信息。
例如,user1消息的提取结果应该如下所示(不包括发件人配置文件详细信息):
| ID|消息|来自用户|图泽|ReplyTo|删除|时间|
| --|--|--|--|--|--|--|
| 8 |msg8| user2| user1| 7 | 0 |T8|
| 7 |MSG7| user2| user1| 7 | 0 |T7|
| 5 |MSG5| user2| user1| 1 | 0 |T5|
| 4 |MSG4| user2| user1| 1 | 0 |T4|
| 3 |MSG3| user2| user1| 1 | 0 |T3|
| 1 |MSG1| user1| user2| 1 | 0 |T1|
| 2 |MSG2| user2| user1| 2 | 0 |T2|
下面的SQL查询当前工作,但不获取每一条消息,并且在显示下一条消息之前回复。

SELECT messages.*, users.name AS name, users.photo AS pic, users.username AS username FROM messages LEFT JOIN users ON messages.fromuser::integer=users.id::integer WHERE messages.delete = '0' ORDER BY messages.id DESC

字符串
PgSQL表:
用户表:

CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY NOT NULL,
  name varchar(255) NOT NULL,
  photo varchar(255) NULL,
  username varchar(255) NULL
);


消息表:

CREATE TABLE IF NOT EXISTS messages (
  id SERIAL PRIMARY KEY NOT NULL,
  message varchar(500) NOT NULL,
  fromuser varchar(255) NOT NULL,
  touser varchar(255) NOT NULL,
  replyto varchar(255) NULL,
  delete varchar(10) NOT NULL,
  time varchar(255) NOT NULL
);


你能帮我优化一下sql查询,这样它就可以在处理下一条消息之前获取每条消息和所有的回复了吗?
提前感谢!

ghg1uchk

ghg1uchk1#

为了优化SQL查询,以便它在移动到下一条消息之前获取每条消息及其所有回复,我们可以使用递归SQL查询来解决它,它可以如下所示:
此查询将获取每封邮件及其所有回复,然后再转到下一封邮件。

SQL
WITH RECURSIVE messages_and_replies (id, message, from_user, to_user, reply_to) AS (
  SELECT id, message, from_user, to_user, reply_to
  FROM messages
  WHERE from_user = 'user1'
  UNION ALL
  SELECT m.id, m.message, m.from_user, m.to_user, m.reply_to
  FROM messages m
  JOIN messages_and_replies mr ON m.reply_to = mr.id
)
SELECT messages_and_replies.*
FROM messages_and_replies
ORDER BY messages_and_replies.id DESC;

字符串

相关问题