За последние 24 часа нас посетили 20125 программистов и 1665 роботов. Сейчас ищут 1547 программистов ...

Вывод записей с иерархией категорий за один запрос

Тема в разделе "PHP и базы данных", создана пользователем Ruzzz, 13 июн 2009.

  1. Ruzzz

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

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Привет! Есть такая задача:
    - Есть обьекты, которые можно хранить так ID, name, info
    - Есть несколько корневых категорий, каждый объект принадлежит какой-то одной из этих категорий
    - И вот самае главное :), есть промежуточные категории

    Первое что приходит в голову добавить поле parentID, который у корневых будет NULL, у промежуточных категорий parentID указывает на категорию уровнем выше и так до корневого, у объектов parentID указывает либо на промежуточную, либо на корневую категорию. (Тут нужно еще обдумать, и возможно добавить rootID для указания на корневую категорию - возможно пригодится :))

    Нужно выводить на одной странице все записи выбранной «корневой» категории так:

    Код (Text):
    1. Корневая категория1
    2.  
    3. Категория1
    4.  
    5.   ПодКатегория1
    6.  
    7. Объект1
    8. Объект2
    9.  
    10.   ПодКатегория2
    11.  
    12. Объект3
    13. Объект4
    Сортировать по имени категорий и объектов.

    Так вот подскажите готовые решения, может есть исходники какие? Как организовать структуру БД? Каким запросом получать массив в PHP чтобы все было отсортировано для удобного вывода? :) Может конечно много прошу :)
     
  2. Ruzzz

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

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Вот нашел еще такое предложение:
    Структура бд:
    Код (Text):
    1. items
    2. ------------------------
    3. id | title | description
    4. ------------------------
    5.  
    6. categoryes
    7. ------------
    8. id | name
    9. ------------
    10.  
    11. items_categoryes
    12. ------------------------
    13. item_id | cat_id
    14. ------------------------
    Вообщем, мне главное это вывод, подскажите какую структуру БД избрать и как составить запрос!!! )
     
  3. Megamozg

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

    С нами с:
    14 май 2010
    Сообщения:
    3
    Симпатии:
    0
    Создать таблицу вида: id : pid : fullpath
    Затем создать функцию (лучше триггер, если поддерживается) которая при добавлении новой ветки автоматом добавляла поле fullpath (грубо говоря перемещалась вверх по дереву от текущего элемента (while pid is not null например). В итоге в этом поле получаем что-то типа /1/4/32... потом выводи сортируя оп этому полю.
     
  4. Einbaukueche

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

    С нами с:
    14 апр 2010
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Там, где много гор и пива.
    @Ruzzz

    гуглите общую тему tree + SQL, hierarchical + data + database итд.

    Предыдущий подход Megamozg называется materialized path и является одним из способом. Другой - классический - nested set. То, что описали вы - adjacency list. Короче, тема обширная. Если ваша структура очень часто читается и очень редко изменяется - пробуйте nested set, он для такого создан (один запрос итд.).