Показать сообщение отдельно
  #4 (permalink)  
Старый 21.12.2017, 02:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

А $res ни о чем не говорит? )

У вас фиксированный уровень вложенности, причем каждое вложение, это отдельная таблица. Проще получить все раздельными запросами:

$level1 = SELECT * FROM category WHERE EXISTS (SELECT * FROM sub_category WHERE sub_category.category_id = category.id) ORDER BY id

$level2 = SELECT * FROM sub_category WHERE category_id IN (implode(',', array_column($level1, 'id'))) AND EXISTS (SELECT * FROM page WHERE page.sub_category_id = sub_category.id) ORDER BY sub_category_id

И из последней как и для второй по набору id из второй и непустых значений. Проходом в цикле первого уровня, получая данные из остальных уровней уровней построить список.

Это же самое можно сделать и с результатом одного запроса, если его правильно отсортировать на выходе.

Уже давно версии MySQL позволяют опускать AS, то есть просто category.id catId. И полезно давать таблицам алиас, чтобы не писать длинные портянки.

Последний раз редактировалось laimas, 21.12.2017 в 02:53.
Ответить с цитированием