首页 > 解决方案 > 选择三个级别的评论

问题描述

我有存储评论的表。评论具有不同的深度,并且它们在一个具有 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))");

有没有办法通过一个查询来获取它们?

标签: phpmysqlsql

解决方案


由于关卡的最大深度为 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         |

在 DB Fiddle 上查看


推荐阅读