sql - 使用递归查询从表中获取电子邮件线程
问题描述
我有一张桌子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>
...
(此表保存电子邮件线程,我们需要获取电子邮件线程)
- 我只知道电子邮件的 and 它
message_id
可以为空或不为空。id
in_reply_to
- 我需要获取那些 in_reply_to 等于我们知道的消息的所有
message_id
s 和s,并继续使用 in_reply_to 获取。id
message_id
- 获取 message_id 后,我需要搜索具有
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;
你能帮我解决这个问题吗?
解决方案
加入 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;
推荐阅读
- hibernate - 根据 HQL 查询结果动态生成 javaFX TableView 的列和行
- javascript - 控制 indexedDB 中相对于异步请求的清理功能的执行顺序?
- python - 未发送 JSON 数据 - Django Rest Framework / React
- arrays - 如何在 Angular Typescript 中将数组作为表单数据发布
- yaml - 版本化 yaml 文件的最佳方法是什么?
- google-cloud-platform - Terraform:未创建 google_sql_database_instance
- android - 旋转活动时如何不破坏 ViewModel
- python - 根据列表中列表中的公共元素提取最大列表
- javascript - 防止使用浏览器放大缩小javascript调整图像大小
- c - Windows 编译 v8 上的 pkg-config 错误