【问题标题】:Hierarchical MariaDB/MySQL recursive query (parent only)分层 MariaDB/MySQL 递归查询(仅限父级)
【发布时间】:2015-01-09 06:38:22
【问题描述】:

我有下表,想在 MariaDB/mySQL 中编写一个适当的 SQL 查询来返回下面的结果。

"dirID" "parentID"  "name"
"1" "0" "C:\"
"2" "1" "\temp"
"3" "1" "\Users"
"4" "3" "\Jon"

dirID name
1     C:
2     C:\temp
3     C:\Users
4     C:\Users\John

到目前为止,我正在尝试使用 CASE WHEN,我很确定它的效率太低,而不是解决问题的方法如下:

cDir 是子目录,pDir 是父目录:

SELECT
    cDir.dirID,
    cDir.parentID,
    cDir.name AS name,
    CASE
        WHEN cDir.parentID != 0 THEN ( SELECT pDir.name )
    END AS path
FROM dirs AS cDir
JOIN dirs AS pDir ON cDir.parentID = pDir.dirID

所以最后我想做一个 CONCAT。

有什么帮助吗? 谢谢。

【问题讨论】:

标签: mysql sql mariadb hierarchical parentid


【解决方案1】:

MariaDB 和 MySQL 没有分层/递归查询,但您可以执行有限级别的查询。

这是一个最多可处理九个级别的查询:

select d1.dirID, concat_ws('', d9.name, d8.name, d7.name,
    d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) as name
from dirs d1
left join dirs d2 on d2.dirID=d1.parentID
left join dirs d3 on d3.dirID=d2.parentID
left join dirs d4 on d4.dirID=d3.parentID
left join dirs d5 on d5.dirID=d4.parentID
left join dirs d6 on d6.dirID=d5.parentID
left join dirs d7 on d7.dirID=d6.parentID
left join dirs d8 on d8.dirID=d7.parentID
left join dirs d9 on d9.dirID=d8.parentID

http://sqlfiddle.com/#!2/3b1c70/1

【讨论】:

  • MySQL 现在支持递归查询:dev.mysql.com/doc/refman/8.0/en/with.html
猜你喜欢
  • 2019-06-20
  • 2016-12-11
  • 2018-07-09
相关资源
最近更新 更多