Я создал скрипт, который создает меню с категориями, подкатегориями и под-категориями. Чтобы получить эти элементы, я использую 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