用于wordpress的自定义mysql select语句

时间:2009-02-16 20:26:02

标签: mysql wordpress

我已经开发了一个我一直在研究的网站的分类,可能会滥用wordpress的分类系统 - 帖子分类在他们所指的主题(比如猫,狗,猴子)以及什么类型的帖子(比如专家,组织,文章)。所以我想找到所有关于猫和狗的帖子,这些都是组织。 IN(猫,狗)和IN(组织)中的某些东西......至少对我来说有什么意义,但我无法找到适合该任务的SQL语法。

基于我在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

谢谢!

1 个答案:

答案 0 :(得分:1)

由于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