【问题标题】:MySQL hierarchy - only show children that are not parentsMySQL 层次结构 - 只显示不是父母的孩子
【发布时间】:2014-02-03 21:05:13
【问题描述】:

我有一个类别表。

Ex(修改自http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

+-------------+----------------------+--------+
| category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |
|          11 | MINI                 |      7 |
|          12 | OFFERS               |   NULL |
+-------------+----------------------+--------+

没有父节点的条目是根节点。我想做一个显示根节点及其后代的视图。

例如:

+-------------+----------------------------------------------------------+
| category_id | category_total                                           |
+-------------+----------------------------------------------------------+
|           3 | ELECTRONICS > Televisions > Tube                         |
|           4 | ELECTRONICS > Televisions > LCD                          |
|           5 | ELECTRONICS > Televisions > Plasma                       |
|           8 | ELECTRONICS > Portable electronics > MP3 players > Flash |
|          11 | ELECTRONICS > Portable electronics > MP3 players > Mini  |
|           9 | ELECTRONICS > Portable electronics > CD Players          |
|          10 | ELECTRONICS > Portable electronics > 2 way radios        |
|          12 | OFFERS                                                   |
+-------------+----------------------------------------------------------+

如果例如类别 5,'Plasma' 应该得到一个子类别,'Plasma' 不应该出现在这个列表中作为最终类别,但它的后代应该代替:

+-------------+----------------------------------------------------------+
| category_id | category_total                                           |
+-------------+----------------------------------------------------------+
|           3 | ELECTRONICS > Televisions > Tube                         |
|           4 | ELECTRONICS > Televisions > LCD                          |
|          13 | ELECTRONICS > Televisions > Plasma > Small               |
|          14 | ELECTRONICS > Televisions > Plasma > Big                 |
|           8 | ELECTRONICS > Portable electronics > MP3 players > Flash |
|          11 | ELECTRONICS > Portable electronics > MP3 players > Mini  |
|           9 | ELECTRONICS > Portable electronics > CD Players          |
|          10 | ELECTRONICS > Portable electronics > 2 way radios        |
|          12 | OFFERS                                                   |
+-------------+----------------------------------------------------------+

最多有 4 个级别的类别。

【问题讨论】:

  • 在不可为空的列上使用WHERE NOT EXISTS()LEFT JOINWHERE IS NULL 都应该为您提供端节点,在您提供的链接中找到它们的踪迹。跨度>
  • Hillyer 没有涵盖这个?

标签: mysql hierarchy


【解决方案1】:

试试这个查询 (sqlFiddle)

CREATE VIEW myView AS
SELECT c.category_id,
       IF(p3.name IS NULL,
          IF(p2.name IS NULL,IF(p1.name IS NULL,c.name,CONCAT(p1.name,' > ',c.name)),
             CONCAT(p2.name,' > ',p1.name,' > ',c.name)),
          CONCAT(p3.name,' > ',p2.name,' > ',p1.name,' > ',c.name)
          )
       as category_total

FROM category c
LEFT JOIN category child ON child.parent = c.category_id
LEFT JOIN category p1 ON p1.category_id = c.parent
LEFT JOIN category p2 ON p2.category_id = p1.parent
LEFT JOIN category p3 ON p3.category_id = p2.parent
WHERE child.category_id is null;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多