php - 为什么在我的嵌套集中没有正确返回项目深度?

标签 php mysql nested-lists

我正在学习嵌套集及其在生成分层列表中的用途。在其他资源中,我特别提到 http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.htmlhttp://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 。有人可以告诉我我做错了什么吗,因为当我查询数据时项目的深度不正确?

这是我的示例的图形表示:

[哦,不,不是!一旦我的代表级别允许,我将尝试为 future 的用户编辑它。]

我在MySQL中创建了一个表并插入数据如下:

CREATE TABLE page_temp (
    page_id INTEGER unsigned NOT NULL AUTO_INCREMENT,
    page_name VARCHAR(255) NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL,
    PRIMARY KEY (page_id)
);

INSERT INTO page_temp VALUES
    (28, 'g', 52, 53), 
    (27, 'f', 50, 51), 
    (26, 'e', 40, 41), 
    (25, 'd', 38, 39), 
    (24, 'c', 10, 11), 
    (23, 'b', 8, 9), 
    (22, 'a', 6, 7), 
    (21, 10, 49, 54), 
    (20, 9, 47, 48), 
    (19, 8, 43, 44), 
    (18, 7, 37, 42), 
    (17, 6, 29, 30), 
    (16, 5, 21, 22), 
    (15, 4, 19, 20), 
    (14, 3, 17, 18), 
    (13, 2, 5, 12), 
    (12, 1, 3, 4), 
    (11, 'H', 46, 55), 
    (10, 'G', 36, 45), 
    (9, 'F', 32, 33), 
    (8, 'E', 28, 31), 
    (7, 'D', 26, 27), 
    (6, 'C', 16, 23), 
    (5, 'B', 14, 45), 
    (4, 'A', 2, 13), 
    (3, 'III', 35, 56), 
    (2, 'II', 25, 34), 
    (1, 'I', 1, 24)
;

然后我使用以下查询拉取该集合:

SELECT CAST(node.page_name AS BINARY) AS title, node.lft, node.rgt, (COUNT(parent.page_name) - 1) AS depth 
    -> FROM page_temp AS node CROSS JOIN page_temp AS parent
    -> WHERE node.lft BETWEEN parent.lft AND parent.rgt
    -> GROUP BY title
    -> ORDER BY node.lft;
+-------+-----+-----+-------+
| title | lft | rgt | depth |
+-------+-----+-----+-------+
| I     |   1 |  24 |     0 |
| A     |   2 |  13 |     1 |
| 1     |   3 |   4 |     2 |
| 2     |   5 |  12 |     2 |
| a     |   6 |   7 |     3 |
| b     |   8 |   9 |     3 |
| c     |  10 |  11 |     3 |
| B     |  14 |  45 |     1 |
| C     |  16 |  23 |     2 |
| 3     |  17 |  18 |     3 |
| 4     |  19 |  20 |     3 |
| 5     |  21 |  22 |     3 |
| II    |  25 |  34 |     1 |
| D     |  26 |  27 |     2 |
| E     |  28 |  31 |     2 |
| 6     |  29 |  30 |     3 |
| F     |  32 |  33 |     2 |
| III   |  35 |  56 |     1 |
| G     |  36 |  45 |     2 |
| 7     |  37 |  42 |     3 |
| d     |  38 |  39 |     4 |
| e     |  40 |  41 |     4 |
| 8     |  43 |  44 |     3 |
| H     |  46 |  55 |     1 |
| 9     |  47 |  48 |     2 |
| 10    |  49 |  54 |     2 |
| f     |  50 |  51 |     3 |
| g     |  52 |  53 |     3 |
+-------+-----+-----+-------+
28 rows in set (0.00 sec)

在这种情况下,我使用 CAST 来强制执行唯一值。我已经以多种不同的方式调整了查询​​,但我无法理解如何获得正确的输出。顺序应该是这样,但深度从项目“C”开始偏离轨道,然后在项目“H”处重新调整。我希望达到的结果是(对深度列进行的更改):

+-------+-----+-----+-------+
| title | lft | rgt | depth |
+-------+-----+-----+-------+
| I     |   1 |  24 |     0 |
| A     |   2 |  13 |     1 |
| 1     |   3 |   4 |     2 |
| 2     |   5 |  12 |     2 |
| a     |   6 |   7 |     3 |
| b     |   8 |   9 |     3 |
| c     |  10 |  11 |     3 |
| B     |  14 |  45 |     1 |
| C     |  16 |  23 |     1 |
| 3     |  17 |  18 |     2 |
| 4     |  19 |  20 |     2 |
| 5     |  21 |  22 |     2 |
| II    |  25 |  34 |     0 |
| D     |  26 |  27 |     1 |
| E     |  28 |  31 |     1 |
| 6     |  29 |  30 |     2 |
| F     |  32 |  33 |     1 |
| III   |  35 |  56 |     0 |
| G     |  36 |  45 |     1 |
| 7     |  37 |  42 |     2 |
| d     |  38 |  39 |     3 |
| e     |  40 |  41 |     3 |
| 8     |  43 |  44 |     2 |
| H     |  46 |  55 |     1 |
| 9     |  47 |  48 |     2 |
| 10    |  49 |  54 |     2 |
| f     |  50 |  51 |     3 |
| g     |  52 |  53 |     3 |
+-------+-----+-----+-------+

一旦正确运行,我将使用 Generate Nested UL's Based Upon Variable Depth Data 中的注释重建输出。感谢您的关注和帮助!

最佳答案

我盯着我的手绘嵌套图表看了两天。我什至为世界制作了一个漂亮的图形来[希望]帮助我解决我的问题。我什至将明显的错误复制到图像文件中。

项目“B”应该是 {14,15},而不是 {14,45}。这就是为什么巢穴在项目“H”{46,55} 处恢复正常。我的妻子总是说我的字写得不好,我给你留下了一个羞涩的第一篇文章......

关于php - 为什么在我的嵌套集中没有正确返回项目深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123244/

相关文章:

php - 获取数据库中的 id 以在下一页上提取相同的数据

php - 使用 Bisna/Doctrine2 处理关闭的 EntityManager

php - 通过搜索栏 php 查询数据库

php - 从数据库动态加载数据到引导 Accordion 导航

python - 检查列表是否由其他列表组成

javascript - 登录尝试失败时的模态弹出窗口

SELECT 中 date() 中的 MySQL 格式错误成功,但在 CREATE TABLE AS SELECT 中失败。那是对的吗?

php - 使用 wpdb 搜索用户元值

PHP/Smarty - 如何检查具有特定值的对象的数组,并创建这些对象的临时数组

python - 根据另一个嵌套列表对嵌套列表进行排序