如何将相同的列值分组并映射到具有相应的帖子值的新列

时间:2013-10-29 18:27:13

标签: mysql database-schema wordpress database-migration

我目前正在使用以下代码获取帖子列表,显示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,并更新数千个帖子,一次性影响每个帖子所需的所有字段。

1 个答案:

答案 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"

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

我将语法更改为ANSI连接语法,因为我发现更容易看到正在发生的事情:连接条件与标准分开(尽管有一个带有Artist和Producer条件的灰色区域 - 见下文)。

既然你说过

  

我想显示两者的帖子行的制作人和艺术家列   做和没有填写艺术家和制作人字段。

我创建了连接LEFT JOIN,它将始终返回左表中的行,如果该行不存在,则从右表中添加NULL。我将Artist / Producer置于连接条件中,而不是WHERE子句,因为它在连接后被评估,并且您将丢失那些NULL条记录。