@mxarts

Вывод новостей с мультикатегориями

Есть таблица hy_category в котором содержатся категории новостей у главных категорий parentd=0 а у их подкатегорий parentid=10 тоисть id главной категории.
Capture.JPG

У таблицы hy_content есть category в котором может быть сразу несколько выбранных категорий
пример: 22,10,7,14
тоисть id значения таблицы hy_category
Capture2.JPG

задача: при просмотре главной категории вывести все его подкатегории и все новости подкатегорий в которых есть мультикатегории
  • Вопрос задан
  • 3404 просмотра
Решения вопроса 1
alt_r
@alt_r
Таблица: hy_content
Поля: content_id title description

Таблица: hy_category
Поля: category_id content_id

Добавление.
INSERT hy_content (title) VALUES ('Новая статья')
получаем ID новой статьи
INSERT hy_category (category_id, content_id) VALUES (3, $content_id); // 3 - примеру ID категории "одежда"
INSERT hy_category (category_id, content_id) VALUES (4, $content_id); // 4 - примеру ID категории "собаки"
INSERT hy_category (category_id, content_id) VALUES (5, $content_id); // 5 - примеру ID категории "семья"
INSERT hy_category (category_id, content_id) VALUES (6, $content_id); // 6 - примеру ID категории "обувь"

Вывод статей по категориям.
SELECT hy_content.* FROM hy_content 
JOIN hy_category ON hy_category.category_id IN (3,4,5) // одежда, собаки и семья
GROUP BY hy_content.content_id
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
У Вас на лицо неправильная организация работы с БД. Зачем таблица связей? при том такая. Сделайте в таблице статей несколько полей для родительских категорий и для категорий потомков. Затем сразу записывайте нужные категории в таблицу статей

Долго думал, что это за слово Вы написали "тоисть" - не надо быть таким безграмотным
Ответ написан
vollossy
@vollossy
Веб-разработчик с небольшим опытом работы
Навскидку предложу такой вариант:
Сперва выбираем нужные категории
SELECT * FROM hy_category WHERE hy_category.parentid = :category_id

Потом из низ строим перечисление идентификаторов для регулярки и выбираем контент регуляркой:
SELECT * FROM hy_content WHERE category RLIKE(',?[{перечисление идентификаторов подкатегорий из прошлого запроса}],?') AND category RLIKE('\d+,.*')

Но это все будет довольно медленно работать. У Вас, как уже указал @VitaZheltyakov, проблемы с организацией бд. Как вариант можно использовать предложенный им метод или просто создать связь многие ко многим.
Ответ написан
Комментировать
alt_r
@alt_r
Один из вариантов.
hy_content не должно быть поля категорий.
hy_category - должны быть ID категорий и ID статей.

При вытаскивании JOIN с таблицей hy_category с фильтром категории и групировать по ID статьи.
Ответ написан
@mandrozz
я бы сделал следующим образом (кратко)
categories: id, parent_id, ...; - таблица категорий
news: id, ...; - таблица новостей
news_categories: new_id, category_id; - связующая таблица

Затем рекурсивно вывести все дочерние категории. А там уже выводить новости из этих категорий.
Ответ написан
kraso4niy
@kraso4niy
fullstack
Как вариант создать отдельную таблицу для связей категория => пост, пост has many категория условно говоря или наоборот.
Затем спарсить в эту таблицу все посты (написать метод для этого) , разделяя explode'ом (split) поле категорий в content. В итоге получите валидную организацию в бд (посредством связей) и увеличите производительность.
В дальнейшем категории можно спарсить в nested sets алгоритм и избежать рекурсий.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы