За последние 24 часа нас посетили 22878 программистов и 1267 роботов. Сейчас ищет 751 программист ...

Это возможно?

Тема в разделе "MySQL", создана пользователем bikerlex, 31 авг 2016.

  1. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Допустим все пункты многоуровнего меню хранятся в одной таблице.
    id title parent_id
    1 Техника 0
    2 Оборудование 0
    3 Землеройная техника 1
    4 Мини-техника 1
    5 Другое оборудование 2
    6 Автогрейдеры 3
    7 Бульдозеры 3
    8 Мини-погрузчики 4

    С первым уровнем всё просто, выбрать все с parent_id = 0. Но возможно ли одним запросом получить все пункты меню 2 или 3 уровней?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Для Nested Set должно быть такое, всё в одной колонке.
    Ещё посмотри Matherialized Path, эти два алгоритма более функциональны, чем твой Adjacency List.
    --- Добавлено ---
    SQL примеры с Nested Set http://www.getinfo.ru/article610.html
     
    bikerlex нравится это.
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    все пункты меню можно просто выбрать скопом, это быстро. А в пхп дерево построить и не париться.

    Nested sets + родитель должны решить задачу. Но её не нужно так решать. В меню тыща пунктов не бывает.
     
  4. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Мне не нужно дерево. У меня 2 селекта, в одном нужны все пункты 2 уровня, в другом все 3 уровня. Взять всё и в цикле раскидать куда надо не проблема. Но мне было интересно можно ли сделать это за раз, выборкой из БД.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    можно, конечно. Но это смысла не имеет. Для выборки всех пунктов меню подряд потратится меньше ресурсов и времени, если их мало.
    --- Добавлено ---
    а, да, и в бд можно сохранять лвл глубины. Тогда и задача решается и просто будет. Но это денормализация ;)
     
  6. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    @denis01 дал ссылку с примерами уровня глубины. Вроде простая вещь, но почему-то такая мысль в голову не приходила. Но я так делать не буду. Если база моя ещё можно так сделать, но в какой-нибудь ЦМС так уже не cделать.
    Запилю рекурсию, ключ массива - лвл.