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

Иногда вам нужно найти информацию по темам, относящимся к определённым категориям, а также ко всем темам в их подкатегориях. Вы можете добавить category_id каждой подкатегории в свой запрос, но в зависимости от вашей структуры категорий и подкатегорий это может привести к довольно длинному списку. :slight_smile:

Альтернативный способ — добавить таблицу 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))

Эти запросы в основном приведены в качестве примеров для демонстрации принципов. Надеемся, они вам пригодятся, но если у вас возникнут вопросы, задавайте их ниже. :slight_smile:

7 лайков