【发布时间】: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 JOIN和WHERE IS NULL都应该为您提供端节点,在您提供的链接中找到它们的踪迹。跨度> -
Hillyer 没有涵盖这个?