我有一个category IDs
字符串,看起来像1;2;3;4;
。
现在,我想在category
表的posts
列中获取包含每个变量的所有帖子。
category
列也有类似1;2;3;
的内容,具体取决于帖子附加的类别。
如何设置一个PDO query
来检查是否在post表的category
列中找到了主字符串中的任何值?
我正在寻找看起来像category LIKE = IN (2;3;4;)
的东西,它也必须使用双/三......这样的数字:2;44;23;
。
示例:
我使用字符串1;
从post表中获取,我想要的结果是Post 1
和Post 3
,因为它们都包含1;
。
答案 0 :(得分:1)
最佳选择是将表重构为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。
编辑:在第二个查询示例中修复拼写错误,别名错误。