最好的选择是将表重构为一个posts
表(没有类别列表字段)和posts_categories
表(具有 post_id 和 category_id 字段)。
然后使用这样的简单查询:
SELECT DISTINCT p.*
FROM posts_categories AS pc
INNER JOIN posts AS p ON pc.post_id = p.post_id
WHERE pc.category_id IN ([your list of values])
;
不幸的是,大多数数据库不支持任意参数列表,因此您可能需要?,?,?,...
在代码中生成确切的系列;但我对 pdo 不熟悉,对 php 也只是稍微熟悉。
编辑:调整查询以仅显示帖子中的数据,并且每个帖子仅显示一次。
如果您还想要类别列表......
SELECT DISTINCT p.*
, GROUP_CONCAT(assoc_pc.category_id SEPARATOR ';') AS catList
FROM posts_categories AS filtering_pc
INNER JOIN posts AS p ON filtering_pc.post_id = p.post_id
INNER JOIN posts_categories AS assoc_pc ON p.post_id = assoc_pc.post_id
WHERE filtering_pc.category_id IN ([your list of values])
GROUP BY p.post_id
;
GROUP_CONCAT
是特定于 MySQL 的;如果您想要更多的平台独立性,您可能想要SELECT p.*, assoc_pc.caetgory_id
并且只是ORDER BY p.post_id
在处理未分组的结果时在代码中构建 catList。
编辑:在第二个查询示例中修复了拼写错误、不正确的别名。