@maragon

Как вывести все записи по parent_id MYSQL?

Имеется таблица:
-- test
--- id | name | parent_id
--- 1 | Первый | 0
--- 2 | Второй | 1
--- 3 | Третий | 2
..etc


Как вывести всю иерархию за один запрос? Т.е, мне нужны все дочерние элементы где parent_id = 2
( Соответственно должно вывести записи с id = 3,2,1 )
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 3
Maksclub
@Maksclub
maksfedorov.ru
Если вам в программе нужна иерархия, то нужно рекурсией выводить...
Но знайте — в 2018 году это не есть гуд, только если у вас немного категорий, если много и вы только-только проектируете БД, то сделайте через Nested Sets (изучать придется дольше, но работоспособность дикая)

По вопросу:
Если рекурсией — это делается на бекенде (например в PHP) написать функцию, которая вызывает саму себя и в каждой итерации будет к каждой категории записывать детей...

Запрос будет тогда максимально простым:
SELECT t.id, t.name
FROM test t
WHERE t.parent_id=2
ORDER BY t.parent_id


Забавно
Вчера помогал человечку на форуме Simpla CMS наоборот уйти от рекурсии, тк там 50 тысяч категорий и как раз проблема вылезла с рекурсией... почитайте о проблеме:
forum.simplacms.ru/topic/13311-%D0%BE%D0%B3%D1%80%...
При таких объемах данных — проблемы полезут сразу и на стороне запросов и на стороне бекенда
Ответ написан
manwe_ru
@manwe_ru
У Opencart классное решение иерархии каталога называется "Closure Table"
CREATE TABLE `oc_category_path` (
  `category_id` int(11) NOT NULL,
  `path_id` int(11) NOT NULL,
  `level` int(11) NOT NULL,
  PRIMARY KEY (`category_id`,`path_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

В общем смысл в том что для каждого элемента дерева хранятся связи со всеми его предками. Хоть решение не идеальное, но зато легко разобраться и быстро встраивается.
P.S. С PK большая избыточность данных не сильно страшна.
Ответ написан
MySQL - никак
В PostgreSQL, например, через with recurisve
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы