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

b0zn9rqh  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(280)

我的表结构:

--------------------------
|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

7rfyedvj

7rfyedvj1#

试试这个:

SELECT (MAX(ID) - 1) as ParentID
FROM your_table;

如果这是不正确的,那么我不明白你的问题,对不起。

e0bqpujr

e0bqpujr2#

在mysql<v8.0中,您唯一真正的选择是存储函数。我想这个能帮到你;它模拟从一个子表递归回表,直到找到一个没有父项的项为止( parent_id 为空):

DROP FUNCTION IF EXISTS depth;
DELIMITER \\
CREATE FUNCTION `depth`(item VARCHAR(20)) RETURNS int(11)
   DETERMINISTIC
BEGIN
 DECLARE d INT DEFAULT 1;
 DECLARE p INT;
 SELECT COALESCE(parent_id, 0) INTO p FROM categories WHERE title = item;
 WHILE p != 0 DO
   SET d = d + 1;
   SELECT COALESCE(parent_id, 0) INTO p FROM categories WHERE id = p;
 END WHILE;
 RETURN (d);
END \\
DELIMITER ;

SELECT depth('t1'), depth('t2'), depth('t3'), depth('t4'), depth('t5'), depth('t6')

输出:

depth('t1')     depth('t2')     depth('t3')     depth('t4')     depth('t5')     depth('t6')     
1               2               2               3               4               1
ws51t4hk

ws51t4hk3#

如果你的mysql版本支持 cte 你可以试着用cte递归来实现它。
架构(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 |

db fiddle视图

相关问题