Как оптимизировать MySQL запрос получения категорий и подкатегорий - PullRequest
2 голосов
/ 27 января 2012

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

Для извлечения основных категорий:

SELECT id, name FROM categories WHERE parent_id=0

Для извлечения подкатегорий для каждой используемой категории:

SELECT id, name FROM categories WHERE parent_id=?

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

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

Ответы [ 3 ]

12 голосов
/ 27 января 2012

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

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

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
2 голосов
/ 27 января 2012

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

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

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

0 голосов
/ 04 января 2013

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

SELECT c1.id, c1.name, c2.id, c2.name 
    FROM category c1
       LEFT JOIN category c2 ON c1.parent_id = c2.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...