2012-11-06 29 views
2

我有一个WordPress数据库下表选择连接表的列值结果列名

帖子

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

postmeta

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

,并与meta_keylatitude和记录longitude

如何编写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 

回答

3

这听起来像你想的PIVOTlatitudelongitude。不幸的是,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

0

你可以使用这样的事情:

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