标签到Post-ID MySQL查询。标签搜索

时间:2011-01-22 作者:Tom Siwik

我正在尝试实现基于标记的搜索。当我指定某些标记时,将搜索标记的帖子,并显示与搜索条件匹配的帖子id。

目前它只适用于单个标记。

$query = "SELECT DISTINCT $wpdb->posts.ID FROM $wpdb->terms
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id)
    LEFT JOIN $wpdb->posts ON ($wpdb->term_relationships.object_id = $wpdb->posts.ID)
        WHERE $wpdb->term_taxonomy.taxonomy = \'post_tag\' " . $substring;
子字符串如下所示:

$substring = "AND $wpdb->terms.slug IN (\'tag1\',\'tag2\')"
这就是问题所在。它不寻找符合所有标准的单个帖子。相反,它“收集”所有帖子,并搜索所有标签。

例如:

// postid1 -> tag1
// postid2 -> tag2
// postid3 -> tag1, tag2

$substring = "AND $wpdb->terms.slug IN (\'tag1\')"
//Output: postid1, postid3 - - - CORRECT
$substring = "AND $wpdb->terms.slug IN (\'tag1\',\'tag2\')"
//Output: postid1, postid2, postid3 - - -WRONG!

//Expected: postid3
到目前为止,我不知道如何在一个mysql查询中解决它。也许我错过了什么。提前感谢您的帮助。

1 个回复
最合适的回答,由SO网友:Rarst 整理而成

这些都是正常的IN 力学-它匹配集合中的任何东西,而不是集合的所有组合。

调用您想要的匹配类型tag_slug__and 在WP查询参数中。您可以在的源代码中看到为其生成SQL的代码WP_Query->&get_posts() 方法

生成的SQL如下所示:

SELECT p.ID 
FROM wp_posts p 
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id) 
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) 
INNER JOIN wp_terms t ON (tt.term_id = t.term_id) 
WHERE tt.taxonomy = \'post_tag\' 
AND t.slug IN (\'is\', \'filler\') 
GROUP BY p.ID HAVING count(p.ID) = 2

结束

相关推荐

插件的MySQL数据库帮助

我正在使用一个名为MyReview 但我想对它做一些修改。该插件具有评论帖子的功能,用户将根据帖子的类别对帖子进行星级评分,但在该插件中,用户可以根据用户的需要对帖子进行任意次数的星级评分,这是我不想要的,我想要的是用户只需一次就可以对帖子进行星级评分,为此我与该插件的作者进行了交流,他建议我这样做,通过相同的电子邮件ID查询评论表中的任何评论,检查是否有任何附加的评分,如果有,则不接受评分。所有这些变化都将纳入多年电价节约计划。php。如果您了解PHP,并且熟悉使用phpMyAdmin来理解数据库表,那