2013-03-13 27 views
0

我有一個創建兩個別名文件,這樣的查詢:將函數應用於一個別名場

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

其確定在某個查詢要使用哪個經度和緯度(有無數JOIN的表中,但對於這個例子來說,唯一的連接是從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) 

但是當我運行查詢,我得到的錯誤Unknown column 'latitude' in 'field list'。有誰知道我可以如何執行這樣的查找。

p.s.

雖然我知道我可以使用地理空間查詢,我想知道在這以後可用於進一步查詢的方式回答,即

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

回答

1

2種方式:

一)取代

 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 
+0

媽的,希望的是簡單的答案,但是,唉,我也認爲這是一些管道夢。謝謝 – topherg 2013-03-13 14:15:06

1
:與SQL

二)別名由一個又一個這樣的封裝第一個查詢

如果你想要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 
相關問題