Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用闭包表分页分层数据(MySQL)_Mysql_Sql_Hierarchical Data_Transitive Closure Table - Fatal编程技术网

使用闭包表分页分层数据(MySQL)

使用闭包表分页分层数据(MySQL),mysql,sql,hierarchical-data,transitive-closure-table,Mysql,Sql,Hierarchical Data,Transitive Closure Table,我正在尝试查询按分数排序的分页分层注释score是一个整数,comments表有一个自引用的parent\u id列 每个页面应至少有一个根注释,后跟其子项。如果数据集中只有一个根注释,那么将只返回一个页面 因此,考虑到注释表中的以下数据: +----+-------+-----------+ | id | score | parent_id | +----+-------+-----------+ | 1 | 10 | NULL | | 2 | 5 | N

我正在尝试查询按
分数排序的分页分层注释
score
是一个整数,comments表有一个自引用的
parent\u id

每个页面应至少有一个根注释,后跟其子项。如果数据集中只有一个根注释,那么将只返回一个页面

因此,考虑到
注释
表中的以下数据:

+----+-------+-----------+
| id | score | parent_id |
+----+-------+-----------+
|  1 |    10 |      NULL |
|  2 |     5 |      NULL |
|  3 |     0 |         1 |
|  4 |     6 |         2 |
|  5 |     0 |      NULL |
|  6 |    30 |         1 |
|  7 |     1 |         3 |
|  8 |     0 |         4 |
|  9 |    50 |      NULL |
| 10 |     2 |         2 |
+----+-------+-----------+
我希望能够
从评论中选择*
限制4偏移量0
,并使第1页成为:

+----+-------+-----------+
| id | score | parent_id |
+----+-------+-----------+
|  9 |    50 |      NULL |
|  1 |    10 |      NULL |
|  6 |    30 |         1 |
|  3 |     0 |         1 |
+----+-------+-----------+
+----+-------+-----------+
| id | score | parent_id |
+----+-------+-----------+
|  2 |     5 |      NULL |
|  4 |     6 |         2 |
| 10 |     2 |         2 |
|  5 |     0 |      NULL |
+----+-------+-----------+
第2页be:

+----+-------+-----------+
| id | score | parent_id |
+----+-------+-----------+
|  9 |    50 |      NULL |
|  1 |    10 |      NULL |
|  6 |    30 |         1 |
|  3 |     0 |         1 |
+----+-------+-----------+
+----+-------+-----------+
| id | score | parent_id |
+----+-------+-----------+
|  2 |     5 |      NULL |
|  4 |     6 |         2 |
| 10 |     2 |         2 |
|  5 |     0 |      NULL |
+----+-------+-----------+
第3页应为空,因为没有根注释

我使用的是一个支持闭包表,如所述,因为可以使用任何注释作为根注释独立查看注释子树,这似乎是最好的解决方案

相关表格的结构和样本数据如下所示:

创建表“注释”(
`id`int(11)无符号非空自动增量,
`分数'int(11)不为空,
`父_id`int(11)无符号默认为空,
主键(`id`)
)ENGINE=InnoDB默认字符集=utf8;
在“注释”中插入(`id`、`score`、`parent\u id`)
价值观
(1,10,空),
(2,5,空),
(3,0,1),
(4,6,2),
(5,0,空),
(6,30,1),
(7,1,3),
(8,0,4),
(9,50,空),
(10,2,2);
创建表“comments\u closure”(
`id`int(11)无符号非空自动增量,
`祖先`int(11)无符号非空,
`后代`int(11)无符号非空,
`深度`int(11)无符号非空,
主键(`id`)
)ENGINE=InnoDB默认字符集=utf8;
插入到“comments\u closure”(`id`、`祖先`、`genderant`、`depth`)中
价值观
(1,1,0), (1,3,1), (1,6,1), (1,7,2),
(2,2,0), (2,4,1), (2,10,1), (2,8,2),
(3,3,0), (3,7,1),
(4,4,0), (4,8,1),
(5,5,0),
(6,6,0),
(7,7,0),
(8,8,0),
(9,9,0),
(10,10,0);

这适用于一级深度查询:

SELECT @id_multiplier := MAX(POW(10, -(length(id) + 1))) FROM comments;
SELECT @score_multiplier := @id_multiplier * MAX(POW(10, -(length(score) + 1))) FROM comments;
SELECT c1.id
     , c1.score
     , c1.parent_id 
FROM comments c1
LEFT JOIN comments c2 
   ON c1.parent_id = c2.id
WHERE c1.parent_id IS NULL 
   OR c1.parent_id IN 
     (SELECT id FROM comments WHERE parent_id IS NULL)
ORDER BY 
   IF(ISNULL(c1.parent_id)
    , c1.score
    , c2.score + (c1.parent_id * @id_multiplier) - (1-(c1.score * @score_multiplier))
    ) DESC