9

这是关于在WordPress中实现的MySQL的一个非常具体的问题。

我正在尝试开发一个插件,该插件将显示(选择)具有特定“标签”并属于特定“类别”(均为多个)的帖子

我被告知这是不可能的,因为类别和标签的存储方式:

  1. wp_posts包含帖子列表,每个帖子都有一个“ID”
  2. wp_terms包含术语列表(类别和标签)。每个术语都有一个 TERM_ID
  3. wp_term_taxonomy有一个术语列表及其 TERM_ID,并且每个术语都有一个分类定义(类别或标签)
  4. wp_term_relationships在术语和帖子之间有关联

如何加入表格以获取标签为“Nuclear”“Deals”且也属于“Category1”类别的所有帖子?

4

6 答案 6

5

我误解了你。我以为你想要核电或交易。下面应该只给你核和交易。

select p.*
from wp_posts p, wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr,
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id and t.term_id = tt.term_id and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id and t2.term_id = tt2.term_id and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and p.id = tr3.object_id and t3.term_id = tt3.term_id and tr3.term_taxonomy_id = tt3.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name = 'Nuclear')
and (tt3.taxonomy = 'post_tag' and tt3.term_id = t3.term_id and t3.name = 'Deals')
于 2008-08-27T17:57:29.053 回答
2

多么粗俗的数据库结构。

无论如何,我会做这样的事情(注意我更喜欢 EXISTS 连接,但如果你愿意,你可以将它们重写为连接;大多数查询分析器无论如何都会将它们折叠到相同的查询计划中)。您可能需要以一种或另一种方式进行一些额外的杂耍才能使其发挥作用...

SELECT *
  FROM wp_posts p
 WHERE EXISTS( SELECT *
                 FROM wp_term_relationship tr
                WHERE tr.object_id = p.id
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'category'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Category1" 
                                           )
                            )
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'post_tag'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Nuclear" 
                                           )
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Deals" 
                                           )
                            )
            )
于 2008-08-26T14:41:27.160 回答
2

试试这个:

select p.*
from wp_posts p, 
wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id
and t.term_id = tt.term_id
and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id
and t2.term_id = tt2.term_id
and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name in ('Nuclear', 'Deals'))

本质上,我使用了 2 个相关子表的副本——terms、term_taxonomy 和 term_relationship。一份适用“Category1”限制,另一份适用“Nuclear”或“Deals”限制。

顺便说一句,这是一个什么样的项目,所有关于核交易的帖子?你想让我们进入一些政府名单?;)

于 2008-08-26T15:29:20.120 回答
1

所以我在我的 WordPress 数据库上尝试了这两个选项。我在我的帖子中使用“Perl”和“编程”标签查找了“技术”类别。

一旦我在初始选择语句中添加了一个缺少的逗号,埃里克就开始工作了。它返回了 3 条记录。问题是正在寻找“post_tag”的部分实际上是作为 OR 选项工作的。我的一篇文章只有一个标签,而不是两者。此外,最好制作 SELECT DISTINCT。

我尝试了马特的版本,但它一直返回一个空集。我可能会尝试“玩弄”它。

于 2008-08-26T23:14:28.893 回答
0

谢谢@Eric,它有效!只是一些代码更正以供将来参考:

  • 在 wp_term_relationship tr2 之后,第一个 select 语句错过了一个昏迷
  • 在同一个 select statemt 中,必须更改以下内容:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

应该

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3
于 2008-08-28T11:22:40.257 回答
0

真的很好的答案..帮了我很多..

很棒的 bcoz。它为我提供了构建复杂查询的基本方法!

一个小的更正,对于像我这样的准备好的用户:)

“wp_term_relationship”将给出“不存在错误”。使用wp_term_relationships,因为它是正确的表名。

谢谢埃里克

于 2009-02-05T15:26:06.137 回答