我有一个创建两个别名文件的查询:
(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'
答案 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