最佳选择是将表重构为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。
编辑:在第二个查询示例中修改了错误的拼写错误别名。
重构你的表结构的一个选项?应该(几乎)总是避免在字段中存储分隔列表。 – Uueerdo
这是可能的,但通常更快?两个单独的查询或使用REGEXP的一个查询?我试图避免使用许多表。 – PhyCoMath
REGEXP和LIKE是一些最慢的运算符,最好在一个查询中加入相关的表。 – Uueerdo