@maragon

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

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


Как вывести всю иерархию за один запрос? Т.е, мне нужны все дочерние элементы где parent_id = 2
( Соответственно должно вывести записи с id = 3,2,1 )
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 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 большая избыточность данных не сильно страшна.
    Ответ написан
Ваш ответ на вопрос

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

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