Intereting Posts
Неправильная ориентация Jcrop от загрузки Iphone, как я могу это сделать? Случай переключения PHP более 1 значения в случае Динамически заменить атрибуты «src» всех тегов <img> Поиск класса, на который нажата кнопка Знаете ли вы о кадре с открытым исходным кодом zend? PHP подсчитывает элементы в многомерном массиве Преобразование JSON в строку UTF-8 ZF2 Тестирование: сбойный код ответа «302», фактический код состояния «500», Можно ли использовать JQuery для вставки закрывающего тега </ tr> и тэга открытия <tr> внутри динамической таблицы? Помогите мне найти $ htmlOption Описание в Yii Передача массива в SOAP-функцию в PHP Разрешить доступ к некоторым страницам cakephp Как включить Socket в PHP? Где я могу сохранить частичные (представления) в Zend Framework, чтобы быть доступным для всех представлений в моем приложении? Facebook OAuthException: токен доступа не может быть расшифрован

Как оптимизировать запрос mysql, получая категории и подкатегории

Я создал скрипт, который создает меню с категориями, подкатегориями и под-категориями. Чтобы получить эти элементы, я использую 3 отдельных запроса MySQL. Следующим образом:

Чтобы получить основные категории:

SELECT id, name FROM categories WHERE parent_id=0 

Чтобы получить подкатегории для каждой категории, я использую:

 SELECT id, name FROM categories WHERE parent_id=? 

Где ? является идентификатором родительской категории. Затем я снова запускаю запрос для каждой подкатегории.

Как я могу оптимизировать этот скрипт для использования меньших sql-запросов? Заранее спасибо.

Попробуйте этот запрос –

категории + подкатегории:

 SELECT c1.id, c1.name, c2.id, c2.name FROM categories c1 LEFT JOIN categories c2 ON c2.parent_id = c1.id WHERE c1.parent_id = 0 

категории + подкатегории + подкатегории:

 SELECT c1.id, c1.name, c2.id, c2.name, c3.id, c3.name FROM categories c1 LEFT JOIN categories c2 ON c2.parent_id = c1.id LEFT JOIN categories c3 ON c3.parent_id = c2.id WHERE c1.parent_id = 0 

Некоторые серверы баз данных имеют конструкции, помогающие этим операциям. Однако MySQL не является одним из них.

Существуют альтернативные способы хранения иерархии в более эффективной базе данных. Для полной истории ознакомьтесь с этой статьей. Он познакомит вас с вложенными наборами.

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Альтернатива, если вы хотите только родительскую категорию категории (количество строк результата должно быть равно количеству строк категории / подкатегории):

 SELECT c1.id, c1.name, c2.id, c2.name FROM category c1 LEFT JOIN category c2 ON c1.parent_id = c2.id