0

我目前正在使用以下代码来获取帖子列表,显示 post_name、post_content 和 post_id,其中有一个名为 MediaLink 的自定义字段 (meta_key)。

 SELECT wp_posts.post_name, wp_posts.post_content, wp_posts.ID 
 FROM wp_posts, wp_postmeta
 WHERE wp_posts.ID = wp_postmeta.post_id
 AND wp_postmeta.meta_key = "MediaLink"

这是该查询中我当前表的可视化示例:

post_name | post_content | post_id |


Name 1         Content 1        1
Name 2         Content 2        2

我想要下表:

post_name | post_content | post_id | 艺术家 | 制片人


Name 1         Content 1        1      Madonna    Philip    
Name 2         Content 2        2      Prince     Jack

问题是 Artist & Producer 目前在 wp_postmeta 表中:

meta_key | meta_value | post_id | meta_id |
___________________________________________
Artist     Madonna         1         1
Artist     Prince          2         2
Producer   Philip          1         3
Producer   Jack            2         4

我应该在我的初始查询中添加什么到第一个查询来完成这个?

我想为已经填写和未填写 Artist 和 Producer 字段的帖子行显示 producer 和 Artist 列。

通过这种方式,我可以使用 PhpMyAdmin 将这些数据导出到 CSV 并更新数千个帖子,从而一次性影响每个帖子所需的所有字段。

4

1 回答 1

0

像这样的东西应该可以解决问题(没有你的数据我无法正确测试,所以如果你得到任何奇怪的结果,请告诉我):

 SELECT p.post_name,
        p.post_content,
        p.ID,
        art.meta_value as artist,
        prd.meta_value as producer
 FROM wp_posts p
      JOIN wp_postmeta pm on p.ID = pm.post_id
      LEFT JOIN wp_postmeta art on p.ID = art.post_id and art.meta_key = 'Artist' 
      LEFT JOIN wp_postmeta prd on p.ID = prd.post_id and prd.meta_key = 'Producer' 
WHERE pm.meta_key = "MediaLink"

作为解释,如果你给它一个别名,你可以在一个查询中多次使用一个表。我在不同的条件下使用了pm,artprd来引用。wp_postmeta

我将您的语法更改为 ANSI 连接语法,因为我发现更容易看到发生了什么:连接条件与标准是分开的(尽管艺术家和制片人条件存在灰色区域 - 见下文)。

既然你说

我想为已经填写和未填写 Artist 和 Producer 字段的帖子行显示 producer 和 Artist 列。

我制作了 joins LEFT JOIN,它将始终从左表返回行,NULL如果该行不存在,则从右表添加。我将 Artist / Producer 放在连接条件中,而不是WHERE子句中,因为它是在连接后评估的,你会丢失这些NULL记录。

于 2013-10-29T21:27:54.193 回答