有时,您想查找属于特定类别的信息,以及这些类别子类别中的所有主题。您可以将每个子类别的 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))
这些查询主要是用于演示原理的示例。希望它们对您有所帮助,如果您有任何问题,请在下方提问。![]()