我目前正在使用以下代码获取帖子列表,显示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
问题在于艺术家& 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
我将初始查询添加到第一个查询以完成此操作?
我想显示发布行的制作人和艺术家列,这些行既包含也没有填充艺术家和制作人字段。
通过这种方式,我可以使用PhpMyAdmin将此数据导出为CSV,并更新数千个帖子,一次性影响每个帖子所需的所有字段。
答案 0 :(得分: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
,art
和prd
来引用wp_postmeta
。
我将语法更改为ANSI连接语法,因为我发现更容易看到正在发生的事情:连接条件与标准分开(尽管有一个带有Artist和Producer条件的灰色区域 - 见下文)。
既然你说过
我想显示两者的帖子行的制作人和艺术家列 做和没有填写艺术家和制作人字段。
我创建了连接LEFT JOIN
,它将始终返回左表中的行,如果该行不存在,则从右表中添加NULL
。我将Artist / Producer置于连接条件中,而不是WHERE
子句,因为它在连接后被评估,并且您将丢失那些NULL
条记录。