使用 REGEXP 选择类别类似于多个类别 ID 的帖子

Selecting posts where category is like multiple category IDs using REGEXP

我有一串 category IDs,看起来像这样 1;2;3;4;

现在我想在 posts table.

category 列中获取所有包含这些变量的所有 post

category 列也有这样的内容 1;2;3; 取决于附加到 post 的类别。

我如何设置一个 PDO query 来检查是否在 post table 的 category 列中找到了主字符串中的任何值?

我正在寻找看起来像 category LIKE = IN (2;3;4;) 的东西,它还必须与 double/triple 一起使用......像这样的数字:2;44;23;.

示例:

我使用字符串 1; 从 post table 中获取,我想要返回的结果是 Post 1Post 3 因为它们都是包含 1;.

最好的选择是将 table 重构为 posts table(没有类别列表字段),posts_categories table(有 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.

编辑:调整查询以仅显示来自 post 秒的数据,并且每个 post.

仅显示一次

如果您也想要类别列表....

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。

编辑:修复了第二个查询示例中的拼写错误、不正确的别名。