2011-12-30 135 views
6

如何從兩個子查詢中使用我的列別名(lat和lng)進行下面的距離計算?我基本上試圖做的是使用經度和緯度值來計算兩個位置之間的距離。但不知何故,我的別名在查詢中不可用,爲什麼?如何使用MySQL列別名進行計算?

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS lat, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS lng, 
(3959 * acos(cos(radians(41.367682)) * cos(radians('lat')) * cos(radians('lng') -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians('lat')))) AS distance 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY ID 
ORDER BY distance ASC 
+1

爲什麼你把lat和lng放在你的表情中? – 2011-12-30 15:03:40

+0

它是否運行沒有任何錯誤或執行此查詢時是否出現一些錯誤? – Lion 2011-12-30 15:11:38

+0

需要引號才能運行查詢,我不會收到任何錯誤,並且所有內容都可以正確返回,但距離計算會爲所有記錄返回相同的值,這意味着輸入的值不會用於任何內容。我在這裏做錯了什麼? – Chris 2011-12-30 15:42:10

回答

4

OK,你需要在這裏做的是加入同一個表(wp_postmeta)兩次下不同的別名,所以你可以使用不同的「WHERE」條件。我沒有你的表,所以我不能對此進行測試,但是這是你要使用的方法:

SELECT wp_posts.*, 
    (`alias_1`.meta_value) AS `lat`, 
    (`alias_2`.meta_value) AS `lng`, 
    (3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts 
    LEFT JOIN `wp_postmeta` AS `alias_1` ON wp_posts.ID = alias_1.post_id 
    LEFT JOIN `wp_postmeta` AS `alias_2` ON wp_posts.ID = alias_2.post_id 
WHERE 
    wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'page' 
    AND wp_posts.post_date < NOW() 
    AND `alias_1`.meta_key = 'position' 
    AND `alias_1`.meta_value LIKE '41.%' 
    AND `alias_2`.meta_key = 'position' 
    AND `alias_2`.meta_value LIKE '2.%' 
GROUP BY wp_posts.`ID` 
ORDER BY `distance` ASC 

我可以在那裏有一些語法錯誤,但我相信邏輯大致正確。讓我知道這個是否奏效。

+1

感謝您的建議!我試過了您的查詢,但得到了和以前一樣的錯誤**未知列'lat'in'field list'**。是否有可能在計算中不能引用別名?對我來說, – Chris 2012-01-06 15:44:16

+0

嗯......我懷疑它,但繼續編輯查詢,以便cos(弧度('lat'))變成cos(弧度('alias_1'.meta_value))等等,並且看看會發生什麼。我在反引號j中附上緯度和經度很好的措施。 – 2012-01-06 15:52:56

+0

我覺得那樣做了!我現在正在查詢一個工作查詢,而距離列現在給我結果,但我不確定它們是否正確。其中一個結果讀出「5.89936971664429e-05」,這看起來很奇怪? – Chris 2012-01-06 15:56:19

1

一旦你創建你的別名(你應該前後加引號),你不應該引用它作爲一個字符串...到別名後續引用應包含在反引號:

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS 'lat', 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS 'lng', 
(3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY `ID` 
ORDER BY 'distance' ASC 

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

+0

我在'字段列表'「中收到錯誤」未知列'lat'「。我猜別名不能這樣引用? – Chris 2011-12-30 15:58:07

+0

啊!你還有另外一個問題。除非你運行子查詢,否則你不應該有多個選擇語句。只需使用「選擇wp_posts。*,wp_postmeta.meta_value作爲'lat',wp_postmeta.meta_value作爲'lng'從wp_posts,wp_postmeta WHRE [列出所有您的條件] – 2011-12-30 16:06:38

+0

但是我需要這些字段的值(lat/lng)距離計算 - 因此子查詢 – Chris 2011-12-30 16:26:58