如何按层次选择所有父母?

时间:2016-12-08 12:39:18

标签: mysql sql

我有一张这样的表:

// tags
+----+--------------+-----------+---------+
| id |   tag_name   | parent_id | related |
+----+--------------+-----------+---------+
| 1  | programming  | NULL      | 1       |
| 2  | medical      | NULL      | 2       |
| 3  | juridical    | NULL      | 3       |
| 4  | HTML         | 1         | 1       |
| 5  | PHP          | 1         | 1       |
| 6  | function     | 5         | 1       |
| 7  | ampoule      | 2         | 2       |
| 8  | needle       | 7         | 2       |
| 9  | CSS          | 1         | 1       |
| 10 | echo         | 5         | 1       |
| 11 | padding      | 9         | 1       |
+----+--------------+-----------+---------+

我也有这个值:function。现在我想选择所有的父母。所以这是预期的结果:

+----+--------------+-----------+---------+
| id |   tag_name   | parent_id | related |
+----+--------------+-----------+---------+
| 1  | programming  | NULL      | 1       |
| 5  | PHP          | 1         | 1       |
+----+--------------+-----------+---------+

我该怎么做?

注意: related列与此问题无关。它添加了它,因为有时我需要选择所有相关的标签(父母和孩子)

1 个答案:

答案 0 :(得分:0)

最好从代码中一次获得一个级别来获取他的数据。但是,如果您知道层次结构中有多少级别,则可以为此准备代码。

如果您最多有4个层次结构,包括最后一个级别,则此代码将起作用。然后你可以为更多级别添加更多联合,或者如果没有多少级别,则删除最后一个联合。

我在这里已经在你的桌子上设置了'tableName'这个名字,并且很快就把它写在了一起,但这应该可行。让我知道如果它不起作用,我将尝试找到一个运行的mysql服务器。

SELECT t1.* 
FROM tableName t1 
JOIN tableName t2 ON t1.id = t2.parent_id 
WHERE t2.tag_name = 'function'
UNION ALL
SELECT t1.* 
FROM tableName t1 
JOIN tableName t2 ON t1.id = t2.parent_id 
JOIN tableName t3 ON t2.id = t3.parent_id 
WHERE t3.tag_name = 'function'
UNION ALL
SELECT t1.* 
FROM tableName t1 
JOIN tableName t2 ON t1.id = t2.parent_id 
JOIN tableName t3 ON t2.id = t3.parent_id 
JOIN tableName t4 ON t3.id = t4.parent_id 
WHERE t4.tag_name = 'function'
ORDER BY ID

(将“函数”更改为变量当然是个好主意)