我有一张桌子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
可以为null或不为null。 message_id
的所有消息中的所有id
和message_id
,并继续使用in_reply_to进行获取。 in_reply_to
字段为message_id
的电子邮件,并提取直到即将来临的message_id不是其他任何消息的in_reply_to
。foreign_key
没有in_reply_to
关系
就像其他任何一列一样,它只是一个列表。 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;
可以帮我解决该查询吗?
答案 0 :(得分:1)
加入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;