【问题标题】:Recursive query in tree MySQL8 / MariaDB10树 MySQL 8 / MariaDB 10 中的递归查询
【发布时间】:2021-05-10 08:26:54
【问题描述】:

我的数据库中有一个树状结构的类别:

create table cat(
     id int auto_increment primary key,
     url varchar(50),
     parent int references cat(id)
)

如何通过将其 url 与父 url 连接来构建类别的 URL? (直到parent 不为空)

我正在使用 MariaDB 10.2

【问题讨论】:

  • 你试过递归 CTE 吗?

标签: sql recursion mariadb


【解决方案1】:

此递归 CTE 将在表中的每个级别形成一个 URL,并使用 / 将它们连接起来(尽管很容易更改)。所需的最终节点在 CTE 中指定(在本例中为7):

WITH RECURSIVE urls AS (
  SELECT url, parent
  FROM cat
  WHERE id = 7
  UNION ALL
  SELECT CONCAT_WS('/', cat.url, urls.url), cat.parent
  FROM urls
  JOIN cat ON cat.id = urls.parent
)
SELECT CONCAT('http://', url) AS url
FROM urls
WHERE parent IS NULL

Demo on dbfiddle

您可以通过在 CTE 中省略 WHERE id = 条件来获取所有可用路径。对于我的示例数据,这给出了:

url
http://home
http://home/apps
http://home/user
http://home/apps/excel
http://home/apps/word
http://home/user/nick
http://home/user/nick/docs

Demo on dbfiddle

【讨论】:

  • 真的吗?这么容易?我尝试万亿次查询已经快 2 小时了
  • 我已经写过其中的一些... :)
  • 注意我更新了查询/演示以添加前缀到 URL。您可以根据需要轻松更改所有这些字符串常量。
  • @Berto99 不用担心 - 我很高兴能帮上忙。
猜你喜欢
  • 2016-12-11
  • 2015-01-09
  • 2020-07-29
  • 2023-03-12
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多