Как получить последнее дочернее отношение в mysql - PullRequest
0 голосов
/ 24 августа 2018

Структура моей таблицы:

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

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Если ваша версия 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 |

Просмотр на БД Fiddle

0 голосов
/ 24 августа 2018

В MySQL 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
0 голосов
/ 24 августа 2018

Попробуйте:

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

Если это не правильно, то я не понял вашего вопроса, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...