将函数应用于别名字段

时间:2013-03-13 13:47:46

标签: mysql

我有一个创建两个别名文件的查询:

 (CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) AS `longitude`
 (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) AS `latitude`

确定在某个查询中使用哪个经度和纬度(表中有很多JOIN,但是为了这个例子,唯一的JOIN来自执行{{1}的Gigs表}到一个名为NATURAL LEFT JOIN的表。

这个位工作正常并返回场地坐标,我有兴趣做距离计算,然后我可以订购。

距离字段如下所示:

Venues

但是当我运行查询时,我收到错误((ACOS(SIN($lat * PI() / 180) * SIN(`latitude` * PI() / 180) + COS($lat * PI() / 180) * COS(`latitude` * PI() / 180) * COS(($lon - `longitude`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) 。有谁知道如何执行这样的查找。

P.S。

虽然我知道我可以使用地理空间查询,但我希望以后来可用于进一步查询的方式知道答案,即

Unknown column 'latitude' in 'field list'

2 个答案:

答案 0 :(得分:1)

2种方式:

a)用SQL

替换别名

b)将您的第一个查询封装为另一个查询,如下所示:

     SELECT 
          t.latitude,
          t.longitude, 
          ((ACOS(SIN($lat * PI() / 180) * SIN(t.latitude * PI() / 180) + COS($lat * PI() / 180) * COS(latitude * PI() / 180) * COS(($lon - t.longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) as distance

     FROM ( 
       SELECT ((CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) AS `longitude`, (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) AS `latitude` FROM Gigs left join Venues on ....
     ) as t

答案 1 :(得分:1)

如果你想SELECT距离,那么我相信你需要重新声明值的大小写。 AKA:不是使用SELECT col alias1, alias1 + 1 alias2,而是必须SELECT col alias1, col + 1 alias2。请查看Where you can use column aliases上的此MySQL文档。

如果您只想GROUP BY距离,那么您可以在距离函数中使用别名。但是,如果您想要SELECT距离,则需要使用已评估的CASE代码替换距离函数中的别名用法。

ORDER BY使用别名:

SELECT
  (CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) longitude,
  (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) latitude
FROM table_name
ORDER BY ((ACOS(SIN(latitude * PI() / 180) * SIN(latitude * PI() / 180) + COS(latitude * PI() / 180) * COS(latitude * PI() / 180) * COS(longitude * PI() / 180)) * 180 / PI()) * 60 * 1.1515)

SELECT无法使用别名(它变得混乱!):

SELECT
  (CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) longitude,
  (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) latitude,
  (
    ((ACOS(SIN((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) * SIN((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) + COS((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) * COS((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) * COS((CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) * PI() / 180)) * 180 / PI()) * 60 * 1.1515)
  ) distance
FROM table_name
ORDER BY distance