0

我有一个查询,它创建两个这样的别名文件:

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

它决定了在某个查询中使用哪个经度和纬度(表中有许多 JOIN,但是为了这个示例,唯一的 JOIN 是从Gigs执行 aNATURAL 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)

但是当我运行查询时,我得到了错误Unknown column 'latitude' in 'field list'。有谁知道我如何执行这样的查找。

ps

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

SELECT *,(CASE WHEN `a` > 0 THEN `a` ELSE `b` END) AS `x`,(`x` MOD 3) AS `y` FROM `Foo`
4

2 回答 2

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
于 2013-03-13T14:13:49.837 回答
1

如果你想SELECT拉开距离,那么相信你需要重新声明该值的大小写。又名:而不是使用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
于 2013-03-13T14:18:25.467 回答