2013-04-12 70 views
0

我試圖讓一個查詢,它給了我一個按當前位置離他們有多遠排序的商店列表。我正在使用php,並使用MySQL作爲我的數據庫。在select子句中使用自定義函數MySQL

爲了計算兩家商店之間的距離,我使用了兩家商店的經度和緯度,並從中得出距離。這包含在一個自定義函數distance($lat1, $lng1, $lat2, $lng2)中。該功能的結果是km中的距離。

我想用這個函數在我的查詢結果中創建一個額外的列,這樣我就可以將所有商店從我當前位置最後面的商店排序到離我目前位置最遠的商店。這兩個函數都在同一個文件中聲明,但我沒有得到任何結果。通過聲明它的方式,可以在SELECT子句中調用一個函數嗎?

function getSortedStores($cur_lat, $cur_lng) 
{ 
    $query = "SELECT Store.ID, Store.Name, distance($cur_lat, $cur_lng, Address.Latitude, Address.Longitude) AS Distance FROM Store INNER JOIN Address ON Store.ID=Address.StoreID ORDER BY Distance"; 
    $result = mysql_query($query); 
    return $result; 
} 

function distance($lat1, $lng1, $lat2, $lng2) 
{ 
    $toRadians = M_PI/180; 
    $lat1 *= $toRadians; 
    $lng1 *= $toRadians; 
    $lat2 *= $toRadians; 
    $lng2 *= $toRadians; 

    $r = 6371; // mean radius of Earth in km 
    $dlat = $lat2 - $lat1; 
    $dlng = $lng2 - $lng1; 
    $a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlng/2) * sin($dlng/2); 
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
    $km = $r * $c; 
    $km = round($km, 1); 

    return $km; 
} 
+0

首先,PHP和SQL是由不同計算機中不同解釋器運行的不同語言。 –

+0

你不能混合使用php和mysql..you必須使用MySql或PHP進行計算後,你已經提取了結果..看看[這裏](http://stackoverflow.com/questions/5217819/effectively-selecting - 最近距離 - 從數據庫記錄/ 5217888#5217888)如何在MySql中有效地執行此操作 – bitWorking

+0

好吧,假設您知道您的代碼是錯誤的。你可以在mysql上創建該函數。 –

回答

0

你不能以這種方式混合使用PHP和MySQL,你可以做在MySQL中,計算與他們math functions,或選擇原始數據並根據PHP中設置的結果進行計算。但是你不能在裏面調用一個PHP函數一個mySQL查詢。

或者,假設您的商店不是手機。您可以創建一個簡單的表格來存儲所有商店之間的距離。它佔用一點額外的存儲空間,但最終可能會爲您節省一點CPU週期。

TABLE distances 
    store1_id INT PK 
    store2_id INT PK 
    distance FLOAT 

SELECT distance 
FROM distances 
WHERE (store1_id = $store1 AND store2_id = $store2) 
    OR (store1_id = $store2 AND store1_id = $store2) 
LIMIT 1