3

我已经为我一直在工作的一个网站开发了一个分类法,该网站可能滥用了 wordpress 的分类系统——帖子被分类在它们所指的主题(比如猫、狗、猴子)以及什么类型的发布它(例如,专家、组织、文章)。所以我想找到所有关于猫和狗以及组织的帖子。类似于 IN(猫、狗)和 IN(组织)的东西......至少对我来说这很有意义,但我无法为该任务找出正确的 SQL 语法。

根据我在 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

谢谢!

4

1 回答 1

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
于 2009-02-16T20:58:38.720 回答