0

我有一串category IDs这样的样子1;2;3;4;

category现在我想在表格的列中获取所有包含这些变量的帖子posts

category列也有这样的内容,1;2;3;具体取决于帖子附加了哪些类别。

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

我正在寻找看起来像的东西category LIKE = IN (2;3;4;),它也必须使用双/三...数字,如下所示:2;44;23;

例子:

  • 帖子 1:1;2;
  • 帖子2:3;
  • 帖子3:1;

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

4

1 回答 1

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。

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

于 2016-05-23T18:59:22.370 回答