我有一串类别 ID
,类似于 1;2;3;4;
。
现在我想获取 posts
表的 category
列中包含每个变量的所有帖子。
category
列还包含类似 1;2;3;
的内容,具体取决于帖子附加的类别。
如何设置 PDO 查询
来检查是否在帖子表的 category
列中找到主字符串中的任何值?
我正在寻找看起来像category LIKE = IN (2;3;4;)
的东西,它也必须与双/三...数字一起使用,如下所示:2;44;23;
.
示例:
- 帖子 1:1;2;
- 帖子 2:3;
- 帖子 3:1;
我使用字符串 1;
从 post 表中获取,我想要返回的结果是 Post 1
和 Post 3
因为它们都包含 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未分组的结果。
编辑:修复了第二个查询示例中的拼写错误、不正确的别名。
关于php - 使用 REGEXP 选择类别类似于多个类别 ID 的帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37398317/