Задать вопрос
@ndlx

Как сделать категории в интернет магазине?

Ознакомился со способами хранения иерархических структур
https://habr.com/ru/companies/bimeister/articles/6...

Выбрал Adjacency List, итого есть таблица с колонками
ID TITLE PARENT_ID
Сам каталог может быть сколь угодно вложенным
Есть так же таблица товаров

Но уже столкнулся с проблемой выбора по всех товаров по родителю
Например двум товарам назначены категории: одному Телефоны, другому Планшеты
И я не могу понять как получить все товары по их родительской категории - Электроника

Мне подсказали что надо использовать CTE запрос, но я плохо знаком с ними, и не могу найти подходящий пример

Из-за этого в целом сомнения касательно самого хранения категорий
Может кто-то знает как это устроено в других системах? Способ хранения и способ получения всех товаров, чьи категории входят сколько угодно много по вложенности
  • Вопрос задан
  • 403 просмотра
Подписаться 1 Простой 7 комментариев
Ответ пользователя Ипатьев К ответам на вопрос (4)
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Да в том-то и дело, что нет такого "тру решения". Даже в той же статье, из которой вы выбрали самый неудачный вариант, приведено ЧЕТЫРЕ варианта работы с деревьями.
Высоколобые интеллектуалы считают, что тру вариант - это вложенные множества.
Люди попроще используют материализованный путь. Из него по разделителю вырезается корневая категория телефонов, и дальше одним запросом с LIKE выбираются все дети.

В вашем же случае самый тупой вариант - это два цикла в приложении, которое работает с БД:
Сначала циклом пройти от телефонов верх, получая родителя, пока он не вернет пустоту. это будет корневая категория
А потом в цикле пройти вниз, получая всех детей, и добавляя их в WHERE IN, пока запрос не вернет то же количество записей, что и предыдущий - то есть, мы дошли до дна. И подставить полученный список в таблицу товаров.

Как вариант, приложение на старте кэширует все дерево категорий в массив, и дальше использует его для всех задач.

А если вам нужен прямо CTE запрос, то во-первых, ставьте нормальные теги, во-вторых, приведите нормальные дампы таблиц (а не вот это на пальцах "ну есть телефончики..."), и тегайте Akina и Slava Rozhnev
Ответ написан