选择连接表的列值作为结果列名

Posted

技术标签:

【中文标题】选择连接表的列值作为结果列名【英文标题】:Selecting a join table's column values as result column name 【发布时间】:2012-10-26 07:53:20 【问题描述】:

我有一个带有以下表格的 WordPress 数据库

帖子

+--------------+
| Field        |
+--------------+
| ID           |
| post_author  |
| post_title   | 
| post_type    | 
+--------------+

后元

+--------------+
| Field        |
+--------------+
| meta_id      |
| post_id      |
| meta_key     |
| meta_value   |
+--------------+

并且记录具有meta_keylatitudelongitude

如何编写 SQL 以将 latitudelongitude 显示为结果列名称?

+--------------+
| Field        |
+--------------+
| ID           |
| post_author  |
| post_title   |
| latitude     |
| longitude    | 
+--------------+

下面的查询是我的出发点

SELECT ID, post_title, meta_key, meta_value FROM `wp_posts` 
LEFT JOIN `wp_postmeta` on ID=post_id 
WHERE post_type='place' AND (meta_key='latitude' OR meta_key='longitude') 
ORDER BY ID ASC

【问题讨论】:

【参考方案1】:

听起来你想PIVOT latitudelongitude 值。不幸的是,mysql 没有 PIVOT 函数,但您可以使用带有 CASE 语句的聚合函数来复制它:

SELECT p.ID, 
  p.post_title, 
  p.post_author,
  max(case when pm.meta_key='latitude' then pm.meta_value end) latitude,
  max(case when pm.meta_key='longitude' then pm.meta_value end) longitude
FROM `wp_posts` p
LEFT JOIN `wp_postmeta` pm
  on p.ID=pm.post_id 
WHERE p.post_type='place' 
  AND (pm.meta_key='latitude' OR pm.meta_key='longitude') 
GROUP BY p.ID, p.post_title, p.post_author
ORDER BY p.ID ASC

见SQL Fiddle with Demo

【讨论】:

【参考方案2】:

你可以使用这样的东西:

SELECT
  wp_posts.ID,
  wp_posts.post_title,
  wp_post_1.meta_value as latitude,
  wp_post_2.meta_value as longitude
FROM
  wp_posts
  LEFT JOIN wp_postmeta wp_post_1
  ON wp_posts.ID=wp_post_1.post_id and wp_post_1.meta_key = 'latitude'
  LEFT JOIN wp_postmeta wp_post_2
  ON wp_posts.ID=wp_post_2.post_id and wp_post_2.meta_key = 'longitude'
WHERE post_type='place'
ORDER BY ID ASC

【讨论】:

以上是关于选择连接表的列值作为结果列名的主要内容,如果未能解决你的问题,请参考以下文章

如何将逗号分隔的列值与另一个表作为行连接

将字典转换为数据框,键作为列名,键值作为数据框的列值

sqlserver count,count(*),count(列名) 详解

count(*) 和 count和count(列名)区别

mysql的那点事儿,你知道吗

count的一些用法