Получение значения из родительской строки в дочернюю строку с помощью рекурсивного запроса MySQL - PullRequest
0 голосов
/ 29 января 2019

Я хочу, чтобы значение из родительской строки находилось в дочерней строке, проблема в том, что все имеет несколько уровней.Проще, если я покажу вам.

Вот что у меня есть: enter image description here

Я хочу получить что-то вроде:

id | question_id | text
74 | 47          | Test answer
75 | 47          | Another answer
76 | 47          | Sub answer
77 | 47          | Sub sub answer

Я хочу получить список всех родителей первого уровня для каждого ответа (строка).Родителю верхнего уровня id 77 является 75, а 75 имеет question_id 47, и это именно то, что мне нужно.Потому что таким образом я могу считать () общее количество ответов из question_id 47.

Я немного исследовал, попробовал следующий код:

SELECT @pv:=id AS id, answered_at, parent 
FROM qa_answers
JOIN (SELECT @pv:=75) AS tmp
WHERE parent = @pv

Но это возвращает только для идентификатора 75,Я хочу показать мне все.Есть идеи как этого добиться?Я не эксперт по SQL.

1 Ответ

0 голосов
/ 29 января 2019

Надеюсь, это вам поможет.

Структура таблицы

CREATE TABLE IF NOT EXISTS `products_t` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `parent_id` varchar(100) DEFAULT NULL,
  `sub_id` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `products_t` (`id`, `name`, `parent_id`, `sub_id`) VALUES
(74, 'category15', '47', NULL),
(75, 'category16', '47', NULL),
(76, 'category19', NULL, '75'),
(77, 'category20', NULL, '76'),
(80, 'category80', NULL, '50'),
(81, 'category81', '50', NULL);

Запрос

select  id,
        name,
        IFNULL(parent_id,'47' ) as parent_id
from    (select * from products_t
         order by parent_id, id) products_sorted,
        (select @pv := '47') initialisation
where   (find_in_set(parent_id, @pv) or find_in_set(sub_id, @pv) )
and     length(@pv := concat(@pv, ',', id))

Здесь значение, указанное в @pv: = '47'следует установить идентификатор родительского элемента, для которого вы хотите выбрать всех потомков.

Результат

id  name        parent_id 
74  category15  47
75  category16  47
76  category19  47
77  category20  47
...