Mysql 如何按层次选择所有父级?
我有一张这样的桌子:Mysql 如何按层次选择所有父级?,mysql,sql,Mysql,Sql,我有一张这样的桌子: // tags +----+--------------+-----------+---------+ | id | tag_name | parent_id | related | +----+--------------+-----------+---------+ | 1 | programming | NULL | 1 | | 2 | medical | NULL | 2 | | 3 | juri
// 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 |
+----+--------------+-----------+---------+
我还有一个值:函数
。现在我要选择它的所有父对象。所以这是预期的结果:
+----+--------------+-----------+---------+
| id | tag_name | parent_id | related |
+----+--------------+-----------+---------+
| 1 | programming | NULL | 1 |
| 5 | PHP | 1 | 1 |
+----+--------------+-----------+---------+
我该怎么做
注意:
相关
栏与此问题无关。添加它是因为有时我需要选择所有相关的标记(包括父标记和子标记)。最好从代码中一次获取一个级别来获取他的数据。但如果您知道层次结构中有多少层,您可以为此编写代码
如果您最多有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
(将“function”更改为变量当然是个好主意)最好从代码中一次获取一个级别来获取他的数据。但如果您知道层次结构中有多少层,您可以为此编写代码 如果您最多有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
(将“function”更改为变量当然是个好主意)MySQL不是用来存储分层数据的。唯一真正做到这一点的方法是使用带有
while
循环的存储过程。但是,您可以使用稍微不同的方式来存储数据,以满足您的需要。下面是一篇很好的博客文章,介绍了实现这一点的方法:。MySQL不是用来存储分层数据的。唯一真正做到这一点的方法是使用带有while
循环的存储过程。但是,您可以使用稍微不同的方式来存储数据,以满足您的需要。下面是一篇关于如何做到这一点的好博文:。