我有一张这样的表:
// 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
列与此问题无关。它添加了它,因为有时我需要选择所有相关的标签(父母和孩子)。
答案 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
(将“函数”更改为变量当然是个好主意)