2013-04-12 47 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