2016-05-23 46 views
0

我有一个category IDs的字符串,看起来像这样1;2;3;4;使用REGEXP选择类别与多个类别ID类似的帖子

现在我想要获取posts表的category列中包含这些变量中的每一个的所有帖子。

category列也有像这样的内容1;2;3;取决于哪些类别已附加到帖子。

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

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

实施例:

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

我使用的字符串1;从表后去取,结果,我想回去是Post 1Post 3,因为它们都含有1;

+0

重构你的表结构的一个选项?应该(几乎)总是避免在字段中存储分隔列表。 – Uueerdo

+0

这是可能的,但通常更快?两个单独的查询或使用REGEXP的一个查询?我试图避免使用许多表。 – PhyCoMath

+0

REGEXP和LIKE是一些最慢的运算符,最好在一个查询中加入相关的表。 – Uueerdo

回答

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。

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

+0

我对此查询有问题。如果没有给出类别字符串,我有办法获取所有帖子吗? – PhyCoMath

+0

不具有相同的查询;您可以完全取出'WHERE','post_categories AS filtering_pc INNER JOIN'和相应的'ON filtering_oc.post_id = p.post_id',以获得类似于原始表格的结果。 ....我注意到在我指出的连接条件中有一个错字,现在修复上面的错误。 – Uueerdo

+0

我遇到了一个奇怪的问题,我还没有能够验证它呢......看起来结果是在我的查询翻倍。这是否有点不正确? ()()()()()()()()()()()$() OR(n.news_lang_all IS NOT NULL))AND n.news_deleted IS NULL AND n.news_published = 1“;' – PhyCoMath