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

时间:2016-05-23 18:45:29

标签: php mysql pdo regexp-like

我有一个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;

示例:

  • Post 1:1; 2;
  • Post 2:3;
  • Post 3:1;

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

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_idORDER BY p.post_id并在处理未分组的结果时在代码中构建catList。

编辑:在第二个查询示例中修复拼写错误,别名错误。