SQL收件箱按发件人id或收件人id列出所有邮件
我有一个表SQL收件箱按发件人id或收件人id列出所有邮件,sql,postgresql,Sql,Postgresql,我有一个表消息如下: CREATE TABLE messages ( id uuid DEFAULT gen_random_uuid() PRIMARY KEY, created_at timestamp with time zone NOT NULL DEFAULT now(), sender_id uuid NOT NULL REFERENCES users(id), receiver_id uuid NOT NULL REFERENCES users(id)
消息如下:
CREATE TABLE messages (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
created_at timestamp with time zone NOT NULL DEFAULT now(),
sender_id uuid NOT NULL REFERENCES users(id),
receiver_id uuid NOT NULL REFERENCES users(id),
message text NOT NULL,
deleted boolean DEFAULT false,
is_read timestamp with time zone
);
我想列出最近收到或发送的所有未删除邮件,以便查看收件箱,我已尝试此查询:
SELECT m.*,
sender.username AS sender_username,
sender.avatar AS sender_avatar,
receiver.username AS receiver_username,
receiver.avatar AS receiver_avatar
FROM messages AS m
INNER JOIN
(
SELECT
LEAST(sender_id, receiver_id) AS sender_id,
GREATEST(sender_id, receiver_id) AS receiver_id,
MAX(created_at) AS created_at
FROM messages
GROUP BY
LEAST(sender_id, receiver_id),
GREATEST(sender_id, receiver_id)
) AS q
ON LEAST(m.sender_id, m.receiver_id) = q.sender_id AND
GREATEST(m.sender_id, m.receiver_id) = q.receiver_id AND
m.created_at = q.created_at
INNER JOIN users sender ON m.sender_id = sender.id
INNER JOIN users receiver ON m.receiver_id = receiver.id
WHERE m.sender_id = 'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2'
OR m.receiver_id = 'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2'
AND m.deleted = FALSE
LIMIT 10 OFFSET 0;
我觉得这个查询需要基于数字的ID,而不是UUID。。
没有更简单的方法进行此查询吗
最后,我将编写一个请求,其中必须列出两个用户之间的最后10条消息
对于不希望打开链接的用户,以下是原始数据:
CREATE TABLE users (
id uuid PRIMARY KEY,
created_at timestamp with time zone NOT NULL DEFAULT now(),
updated_at timestamp with time zone NOT NULL DEFAULT now(),
deleted_at timestamp with time zone,
username text NOT NULL UNIQUE,
email text NOT NULL UNIQUE,
password text NOT NULL,
avatar text
);
CREATE TABLE messages (
id uuid PRIMARY KEY,
created_at timestamp with time zone NOT NULL DEFAULT now(),
sender_id uuid NOT NULL REFERENCES users(id),
receiver_id uuid NOT NULL REFERENCES users(id),
message text NOT NULL,
deleted boolean DEFAULT false,
is_read timestamp with time zone
);
INSERT INTO "users"("id","created_at","updated_at","deleted_at","username","email","password","avatar")
VALUES
(E'17c10b11-d895-4d6e-b332-ba29494540ee',E'2021-05-11 15:17:42.233379+04',E'2021-05-11 16:18:03.06961+04',NULL,E'user1',E'user1@yopmail.com',E'xxxx',E'/img/user1.png'),
(E'bf1de12e-1845-4923-b978-9ede5bae6560',E'2021-05-11 15:17:42.233379+04',E'2021-05-11 16:18:03.06961+04',NULL,E'user2',E'user2@yopmail.com',E'xxxx',E'/img/user2.png'),
(E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'2021-05-11 15:17:42.233379+04',E'2021-05-13 07:39:16.510222+04',NULL,E'user',E'user@yopmail.com',E'xxxx',E'/img/user.png');
INSERT INTO "messages"("id","created_at","sender_id","receiver_id","message","deleted","is_read")
VALUES
(E'1e0316d4-4392-44b0-9928-719a339e3e2e',E'2021-05-13 12:18:16.630658+04',E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'17c10b11-d895-4d6e-b332-ba29494540ee',E'ping',FALSE,NULL),
(E'f77f7623-e1df-4257-a1b9-89ebb0c38d23',E'2021-05-13 12:18:37.702524+04',E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'bf1de12e-1845-4923-b978-9ede5bae6560',E'ping',FALSE,NULL),
(E'd196b2ea-84ed-4d56-8b15-e0b9e1ba8212',E'2021-05-13 12:19:03.549715+04',E'bf1de12e-1845-4923-b978-9ede5bae6560',E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'pong',FALSE,NULL),
(E'3138aa5a-3d48-4123-a078-c43caf692484',E'2021-05-13 12:19:15.016226+04',E'17c10b11-d895-4d6e-b332-ba29494540ee',E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'pong',TRUE,NULL),
(E'7ab80cd7-821d-4854-81ed-98392edc4ada',E'2021-05-13 19:53:37.59779+04',E'17c10b11-d895-4d6e-b332-ba29494540ee',E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'pong 2',TRUE,NULL),
(E'88fdf968-ebae-4268-a04d-06a7811f9db7',E'2021-05-13 19:58:12.304655+04',E'bfa46dbd-b260-4b3c-ba16-06e030b1c0c2',E'17c10b11-d895-4d6e-b332-ba29494540ee',E'pin 2',FALSE,NULL);
请添加示例数据,使您的问题更清楚。我不清楚你到底想在这里做什么。嘿,不,我甚至不会打开链接。你的问题应该包括最基本的数据,以使观点得到理解。@TimBiegeleisen好吗?