Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按层次选择所有父级?_Mysql_Sql - Fatal编程技术网

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
循环的存储过程。但是,您可以使用稍微不同的方式来存储数据,以满足您的需要。下面是一篇关于如何做到这一点的好博文:。