php - 选择三个级别的评论
问题描述
我有存储评论的表。评论具有不同的深度,并且它们在一个具有 id 和 parent_id 的表中相互关联。深层次的最大值是三,我想用一个查询而不是三个查询来选择它们,并使用 foreach 三次。
评论表:
id title parent_id
1 'where are you?' NULL
2 "im at home" 1
3 "what is time in your country?" NULL
4 "it's 3 pm" 3
5 "oh that's cool" 4
第一级是具有 parent_id = NULL 的评论我使用这些查询来获取它们:
$first = $this->db->query("SELECT title FROM comment WHERE parent_id IS NULL");
$second = $this->db->query("SELECT title FROM comment WHERE parent_id IN (SELECT id FROM comment WHERE parent_id IS NULL)");
$third= $this->db->query("SELECT title FROM comment WHERE parent_id IN (SELECT id FROM comment WHERE parent_id IN(SELECT id FROM comment WHERE parent_id IS NULL))");
有没有办法通过一个查询来获取它们?
解决方案
由于关卡的最大深度为 3,我们可以利用两个自连接来确定父 ID,并使用自定义排序。
如果您的 MySQL/MariaDB 版本不支持递归 CTE,请尝试以下解决方案:
架构(MySQL v5.7)
CREATE TABLE comment
(`id` int, `title` varchar(33), `parent_id` varchar(4))
;
INSERT INTO comment
(`id`, `title`, `parent_id`)
VALUES
(1, 'where are you?', NULL),
(2, 'what is time in your country?', NULL),
(3, 'im at home', '1'),
(4, 'its 3 pm', '2'),
(5, 'oh thats cool', '4')
;
查询 #1
SELECT c1.id, c1.title, c1.parent_id
FROM comment AS c1
LEFT JOIN comment AS c2 ON c2.id = c1.parent_id
LEFT JOIN comment AS c3 ON c3.id = c2.parent_id
ORDER BY
CASE WHEN c1.parent_id IS NULL THEN c1.id /* first level comment*/
WHEN c2.parent_id IS NULL THEN c2.id /* second level comment */
ELSE c3.id /* comment is at third level */
END ASC,
c1.id ASC;
| id | title | parent_id |
| --- | ----------------------------- | --------- |
| 1 | where are you? | |
| 3 | im at home | 1 |
| 2 | what is time in your country? | |
| 4 | its 3 pm | 2 |
| 5 | oh thats cool | 4 |
推荐阅读
- java - 如何运行作为地图上的值的 lambda 表达式
- xml - 用数据库变量分配 JMS 变量的问题
- objective-c - Coregraphics Private API 使用导致应用被拒绝?
- javascript - 在浏览器上比较时如何检查“↵”(新行)?
- azure - 阻止 RBAC 继承
- postgresql - 为什么不能更新设置更改数据类型 Postgres
- python - 有没有一种方法可以使用 Spotipy 从播放列表中检索所有曲目?
- python - 如何在python的文本文件中编写稀疏矩阵?
- c# - 转换字符串分词器
- api - 当我的 API 关闭时,如何获取 503 错误代码而不是 504?