Зачем LEFT JOIN если таблица та же?

D
На сайте с 28.06.2008
Offline
1101
336

Немного тупит один запрос, пытаюсь его анализировать

SELECT m.*, count(p.parent_id) as cnt FROM #__menu AS m LEFT JOIN #__menu AS p ON p.parent_id = m.id WHERE m.menutype='main-menu' AND m.published='1' GROUP BY m.id ORDER BY m.parent_id, m.lft

И мне кажется странным - зачем тут LEFT JOIN если таблица та же? Можно ли как то оптимизировать его?

Индексы есть на все поля.

M
На сайте с 04.12.2013
Offline
223
#1

Рекурсия. Пункты меню/подменю хранятся в одной таблице.

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
D
На сайте с 28.06.2008
Offline
1101
#2

published='1' можно выкинуть, все меню опубликованы, не понятно зачем - count(p.parent_id) as cnt

А так можно?

SELECT * FROM `#__menu` WHERE `menutype` = 'main-menu' GROUP BY `id` ORDER BY `parent_id`, `lft`
LEOnidUKG
На сайте с 25.11.2006
Online
1723
#3

Выкидывай всё, если вывод не меняется визуально. Там же в джумле сделано всё универсально.

count сделан, чтобы выводить количество записей в каждой категории.

У тебя там всё равно уже от джумлы практически ничего не осталось :)

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
M
На сайте с 04.12.2013
Offline
223
#4

То кол-во пунктов подменю для каждого пункта меню. Пока вы не присоедините пункты подменю, у вас не будет их parent_id.

---------- Добавлено 13.01.2019 в 14:17 ----------

...при условии WHERE `menutype` = 'main-menu'.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий