分类及其子分类(使用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 个赞