2015-05-29 40 views
1

此查詢的工作:MySQL列沒有被發現,儘管被宣佈?

select d.*, 
(6371 * 3.1415926 * SQRT((:lat - dl.lat) * (:lat - dl.lat) + COS(:lat/57.2957795) * COS(dl.lat/57.2957795) * (:long - dl.long) * (:long - dl.long))/180) as xdistance 
from `dudes` as d 
left join `dude_locations` as dl on (dl.id_dude = d.id) 
where 
(6371 * 3.1415926 * SQRT((:lat - dl.lat) * (:lat - dl.lat) + COS(:lat/57.2957795) * COS(dl.lat/57.2957795) * (:long - dl.long) * (:long - dl.long))/180) <= dl.distance 
group by d.id 
limit 20 

然而,這個查詢拋出一個「列xdistance未找到」錯誤:

select d.*, 
(6371 * 3.1415926 * SQRT((:lat - dl.lat) * (:lat - dl.lat) + COS(:lat/57.2957795) * COS(dl.lat/57.2957795) * (:long - dl.long) * (:long - dl.long))/180) as xdistance 
from `dudes` as d 
left join `dude_locations` as dl on (dl.id_dude = d.id) 
where 
xdistance <= dl.distance 
group by d.id 
limit 20 

所有我想要做的就是它,因此同樣的計算ISN」做了兩次。這可能嗎?

任何幫助,將不勝感激。

+0

您的查詢需要一些改進。您正在使用'left join',然後第二個表上的條件將它變成一個'inner join'。你在'select'中有距離計算,但是'group by'不包含這些變量 - 所以你會得到一個不確定的結果。 –

+0

工作查詢爲我提供了我想要的確切結果。你會如何寫它?你可能會創建一個答案,你將如何編寫查詢?我不是想讓你爲我做我的工作,我只是好奇。 – inkd

+1

。 。它可能會給你你想要的結果*現在*。但是,當您使用明確記錄不起作用的功能時(https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html),那麼您將冒着代碼失敗的風險隨時工作。我認爲你可以通過將'distance'計算放在像'min()'這樣的運算符中來修復查詢。 –

回答

1
where 
d.xdistance <= dl.distance 
+0

不起作用。我現在得到'未知列d.distance'。 – inkd

+0

@inkd我認爲錯誤會是未知列d.xdistance – wiretext

+0

是的,我犯了一個錯字。 – inkd

1

這可能是你想要的查詢是這樣的:

select d.*, 
     MIN((6371 * 3.1415926 * SQRT((:lat - dl.lat) * (:lat - dl.lat) + COS(:lat/57.2957795) * COS(dl.lat/57.2957795) * (:long - dl.long) * (:long - dl.long))/180)) as xdistance 
from `dudes` as d left join 
    `dude_locations` as dl 
    on (dl.id_dude = d.id) 
group by d.id 
having xdistance <= min(dl.distance) 
limit 20;