选择连接表的列值作为结果列名
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_key
值latitude
和longitude
如何编写 SQL 以将 latitude
和 longitude
显示为结果列名称?
+--------------+
| 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
latitude
和 longitude
值。不幸的是,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
【讨论】:
以上是关于选择连接表的列值作为结果列名的主要内容,如果未能解决你的问题,请参考以下文章