mysql - 如何在mysql中获取最后一个子关系

标签 mysql sql database relationship

我的表结构:

--------------------------
|Categories              |
--------------------------
|id    |parent_id|title  |
--------------------------
|1     |null     |t1     |
--------------------------
|2     |1        |t2     |
--------------------------
|3     |1        |t3     |
--------------------------
|4     |2        |t4     |
--------------------------
|5     |4        |t5     |
--------------------------
|6     |null     |t6     |
--------------------------

我需要找出给定项目/类别与其根项目/类别(包括指定项目和根项目)之间有多少项目。

例如,在此表中 title=t5 的计数为 4 (t1->t2->t4->t5).

MySQL版本:5.6.21

最佳答案

如果你的 mysql 版本支持 cte 你可以尝试使用 CTE Recursion 来实现。

架构(MySQL v8.0)

CREATE TABLE  Categories(
   id INT,
   parent_id INT,
   title VARCHAR(50)
);



INSERT INTO Categories VALUES (1,null,'t1');
INSERT INTO Categories VALUES (2,1   ,'t2');
INSERT INTO Categories VALUES (3,1   ,'t3');
INSERT INTO Categories VALUES (4,2   ,'t4');
INSERT INTO Categories VALUES (5,4   ,'t5');
INSERT INTO Categories VALUES (6,null,'t6');

查询#1

WITH RECURSIVE  cte1 AS (
  SELECT id,parent_id,title
  FROM Categories
  where title = 't5'
  UNION ALL
  SELECT cte1.id,c.parent_id,c.title
  FROM cte1 INNER JOIN Categories c
  on c.id = cte1.parent_id
)
SELECT id,GROUP_CONCAT(title separator '->') result
FROM cte1
GROUP BY id;

| id  | result         |
| --- | -------------- |
| 5   | t5->t4->t2->t1 |

View on DB Fiddle

关于mysql - 如何在mysql中获取最后一个子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52002385/

相关文章:

mysql - 为什么我的函数没有使用另一个函数作为输入返回值?

c# - 使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView

ruby-on-rails - 更改列名称 Rails

php - 将变量传递给 mysql 语句

mysql - 如何增加 MySQL 数据库的大小?

mysql - 合并两个 sql 查询 -

PHP 和 SQL 空间问题

phpMyAdmin,导入 csv 时文本被截断

database - 无状态微服务和数据库

MySQL 将 IN 子句中的值与每个组值匹配