如何在不使用嵌套查询的情况下解决未知别名列问题?

时间:2012-11-06 12:33:14

标签: mysql sql alias nested-queries inner-query

我有查询

SELECT ID, 
  post_title, 
  post_author,
  max(case when meta_key='geo_latitude' then meta_value end) latitude,
  max(case when meta_key='geo_longitude' then meta_value end) longitude,
 ( 3959 * acos( cos( radians(18.204540500000) ) 
                   * cos( radians( latitude ) ) 
                   * cos( radians( longitude ) 
                       - radians(-66.450958500000) ) 
                   + sin( radians(18.204540500000 ) )
                   * sin( radians( latitude ) ) 
                 )
   ) AS distance 
FROM `wp_posts` 
LEFT JOIN `wp_postmeta` 
  on ID=post_id 
WHERE post_type='place' 
  AND (meta_key='geo_latitude' OR meta_key='geo_longitude') 
GROUP BY ID, post_title, post_author
ORDER BY ID ASC

导致

Error Code: 1054. Unknown column 'latitude' in 'field list'

有没有办法在不使用内部/嵌套查询的情况下解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以创建视图:

create view geo as
    select id, post_title, post_author,
           max(case when meta_key='geo_latitude' then meta_value end) as latitude,
           max(case when meta_key='geo_longitude' then meta_value end) as longitude
    from wp_posts
    where post_type='place'
          and (meta_key='geo_latitude' OR meta_key='geo_longitude')
    group by id, post_title, post_author;

并使用它而不是wp_posts加入您的查询:

SELECT ID, 
  post_title, 
  post_author,
  latitude,
  longitude,
 ( 3959 * acos( cos( radians(18.204540500000) ) 
                   * cos( radians( latitude ) ) 
                   * cos( radians( longitude ) 
                       - radians(-66.450958500000) ) 
                   + sin( radians(18.204540500000 ) )
                   * sin( radians( latitude ) ) 
                 )
   ) AS distance 
FROM `geo` 
LEFT JOIN `wp_postmeta` 
  on ID=wp_postmeta.post_id 
ORDER BY ID ASC;

答案 1 :(得分:1)

试试这个:

SELECT ID, 
  post_title, 
  post_author,
  MAX(CASE WHEN meta_key='geo_latitude' THEN meta_value END) latitude,
  MAX(CASE WHEN meta_key='geo_longitude' THEN meta_value END) longitude, 
  ( 3959 * ACOS( COS( RADIANS(18.204540500000) ) 
                   * COS( RADIANS( MAX(CASE WHEN meta_key='geo_latitude' THEN meta_value END) ) ) 
                   * COS( RADIANS( MAX(CASE WHEN meta_key='geo_longitude' THEN meta_value END) ) 
                       - RADIANS(-66.450958500000) ) 
                   + SIN( RADIANS(18.204540500000 ) )
                   * SIN( RADIANS( MAX(CASE WHEN meta_key='geo_latitude' THEN meta_value END) ) ) 
                 )
   ) AS distance  
FROM `wp_posts` 
LEFT JOIN `wp_postmeta` 
  ON ID=post_id 
WHERE post_type='place' 
  AND (meta_key='geo_latitude' OR meta_key='geo_longitude') 
GROUP BY ID, post_title, post_author
ORDER BY ID ASC