我有一个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查询,这样它就可以在处理下一条消息之前获取每条消息和所有的回复了吗?
提前感谢!
1条答案
按热度按时间ghg1uchk1#
为了优化SQL查询,以便它在移动到下一条消息之前获取每条消息及其所有回复,我们可以使用递归SQL查询来解决它,它可以如下所示:
此查询将获取每封邮件及其所有回复,然后再转到下一封邮件。
字符串