我有一个表格emails
:
id message_id in_reply_to
1 <me123@gmail.com> null
2 <me345@gmail.com> <me123@gmail.com>
3 <me567@gmail.com> <me345@gmail.com>
4 <me768@gmail.com> <me567@gmail.com>
5 <me910@gmail.com> null
6 <me911@gmail.com> <me768@gmail.com>
7 <me912@gmail.com> <me567@gmail.com>
8 <me913@gmail.com> <me912@gmail.com>
9 <me914@gmail.com> <me913@gmail.com>
10 <me915@gmail.com> <me914@gmail.com>
11 <me916@gmail.com> <me914@gmail.com>
...
(此表保存电子邮件线程,我们需要获取电子邮件线程)
- 我只知道电子邮件的
message_id
和id
及其in_reply_to
可以为空或不为空。 - 我需要获取这些消息的所有
message_id
和id
,其中in_reply_to等于我们知道的message_id
,并继续获取in_reply_to。 - 获取message_id后,我需要搜索具有
in_reply_to
字段的其他电子邮件,因为message_id
并获取,直到即将到来的message_id没有in_reply_to
任何其他消息。
在 in_reply_to
方面没有foreign_key
关系 它只是一个列表,就像任何其他列一样。id
是电子邮件表的主键,message_id
对于每封电子邮件始终是唯一的。- 一个
message_id
可以是许多消息in_reply_to
。
如果我通过message_id
=<me912@gmail.com>
我的输出表应该是
id message_id in_reply_to
8 <me913@gmail.com> <me912@gmail.com>
9 <me914@gmail.com> <me913@gmail.com>
10 <me915@gmail.com> <me914@gmail.com>
11 <me916@gmail.com> <me914@gmail.com>
我只知道我需要使用递归,但我无法理解WITH RECURSIVE
- https://www.postgresql.org/docs/current/queries-with.html
我尝试了一下:
WITH RECURSIVE emails AS (
SELECT message_id, in_reply_to FROM emails WHERE id = ?
UNION ALL
SELECT message_id, in_reply_to
FROM emails where in_reply_to = // Stuck here
)
SELECT *
FROM emails;
你能帮我解决查询吗?
加入 CTE 比较email_id
和in_reply_to
。
WITH RECURSIVE
thread
AS
(
SELECT e.id,
e.message_id,
e.in_reply_to
FROM emails e
WHERE id = 8
UNION ALL
SELECT e.id,
e.message_id,
e.in_reply_to
FROM emails e
INNER JOIN thread t
ON t.message_id = e.in_reply_to
)
SELECT *
FROM thread
ORDER BY id;
数据库<>小提琴