Иногда вам нужно найти информацию по темам, относящимся к определённым категориям, а также ко всем темам в их подкатегориях. Вы можете добавить category_id каждой подкатегории в свой запрос, но в зависимости от вашей структуры категорий и подкатегорий это может привести к довольно длинному списку. ![]()
Альтернативный способ — добавить таблицу categories и использовать оператор OR:
(Не забудьте заменить значение на ID вашей родительской категории)
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id = 5 OR c.parent_category_id = 5)
Вы также можете использовать это с параметром:
-- [params]
-- int :category_id
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id = :category_id OR c.parent_category_id = :category_id)
Чтобы адаптировать запрос для нескольких категорий с подкатегориями, замените параметр на версию int_list и измените запрос, используя оператор IN следующим образом:
-- [params]
-- int_list :category_id
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id IN (:category_id) OR c.parent_category_id IN (:category_id))
Или пропишите родительские категории прямо в запросе:
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id IN (4, 5) OR c.parent_category_id IN (4, 5))
Эти запросы в основном приведены в качестве примеров для демонстрации принципов. Надеемся, они вам пригодятся, но если у вас возникнут вопросы, задавайте их ниже. ![]()