自定义mysql选择语句为wordpress

自定义mysql选择语句为wordpress

问题描述:

我已经开发了一个网站的分类,我一直在努力,可能会滥用WordPress的分类系统 - 职位是根据他们所指的主题归类(比方说,猫,狗,猴子)以及它是什么类型的职位(比如专家,组织,文章)。所以我想找到所有关于猫狗的帖子,这些是组织。 IN(猫,狗)和IN(组织)中的某些东西......至少它对我来说意义重大,但我无法弄清楚任务的正确SQL语法。自定义mysql选择语句为wordpress

根据我在this article on wordpress.com中找到的内容,我从下面的查询中构建...但我不确定如何说'我想要的属于(类别1或2 )和(属于类别3)(例如,猫1 =猫,2 =狗,3 =组织)。

这可能很简单,当我得到回复时我会踢自己。

SELECT * FROM $wpdb->posts 
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) 
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
WHERE $wpdb->term_taxonomy.term_id = 1,2,3 
AND $wpdb->term_taxonomy.taxonomy = 'category' 
AND $wpdb->posts.post_status = 'publish' 
ORDER BY $wpdb->postmeta.meta_value ASC 

谢谢!

由于term_taxonomy表的不同行上存在两个条件,因此您必须连接到该表两次以便在结果集的一行中进行比较。

另外我不认为你需要使用LEFT JOIN,因为你在WHERE子句中使用条件。外连接通常比内连接慢。

您可以使用表别名,因此您不必一直重复变量表名称。

,所以我没有测试,但你需要满足以下条件应更贴近:

SELECT * FROM $wpdb->posts p 
INNER JOIN $wpdb->postmeta m ON (p.ID = m.post_id) 
INNER JOIN $wpdb->term_relationships r1 ON (p.ID = r1.object_id) 
INNER JOIN $wpdb->term_taxonomy x1 
    ON (r1.term_taxonomy_id = x1.term_taxonomy_id) 
INNER JOIN $wpdb->term_relationships r2 ON (p.ID = r2.object_id) 
INNER JOIN $wpdb->term_taxonomy x2 
    ON (r2.term_taxonomy_id = x2.term_taxonomy_id) 
WHERE x1.term_id IN (1, 2) AND x1.taxonomy = 'category' 
AND x2.term_id = 3 AND x2.taxonomy = 'category' 
AND p.post_status = 'publish' 
ORDER BY m.meta_value ASC 
+0

真棒;像魅力一样工作。我添加了“GROUP BY p.id”,因此不会返回重复的帖子。谢谢! – bennettk 2009-02-16 21:10:46