在select子句MySQL中使用自定义函数

时间:2013-04-12 16:53:48

标签: php mysql

我正在尝试进行查询,该查询会根据它们与当前位置的距离来排序。我正在使用php并使用MySQL作为我的数据库。

为了计算2个商店之间的距离,我使用2个商店的经度和纬度,并从中得出距离。这包含在自定义函数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;
}

2 个答案:

答案 0 :(得分:0)

你不能在mysql中使用php函数。有关mysql用户定义函数的更多详细信息

看到这个

http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html

答案 1 :(得分:0)

您不能以这种方式混合PHP和mySQL,您可以使用math functions在mySQL中进行计算,或者选择原始数据并根据PHP中的结果集进行计算。但是你不能在mySQL查询中调用PHP函数

或者,假设您的商店不是移动商店。您可以创建一个简单的表格来存储所有商店之间的距离。它占用了一点额外的存储空间,但最终可能会为您节省相当多的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