Php 在select子句中使用自定义函数
我正在尝试获取一个查询,该查询将提供一个按距离当前位置多远排序的商店列表。我在php中工作,并使用MySQL作为我的数据库 为了计算两个存储之间的距离,我使用了两个存储中的经度和纬度,并从中推导出距离。这包含在自定义函数Php 在select子句中使用自定义函数,php,mysql,Php,Mysql,我正在尝试获取一个查询,该查询将提供一个按距离当前位置多远排序的商店列表。我在php中工作,并使用MySQL作为我的数据库 为了计算两个存储之间的距离,我使用了两个存储中的经度和纬度,并从中推导出距离。这包含在自定义函数距离($lat1、$lng1、$lat2、$lng2)中。此功能的结果是距离,单位为km 我想使用这个函数在我的查询结果中创建一个额外的列,这样我就可以对所有存储进行排序,从我当前位置最后面的一个到我当前位置最远的一个。这两个函数都在同一个文件中声明,但我没有得到任何结果。是否可
距离($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;
}
您不能在mysql中使用php函数。有关mysql用户定义函数的更多详细信息 看到这个了吗
您不能以这种方式混合使用PHP和mySQL,您可以使用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
首先,PHP和SQL是不同的语言,由不同的解释器在可能不同的计算机上运行。你不能混合使用PHP和mysql。你必须在获取结果后使用mysql或PHP进行计算。假设你知道你的代码是错的,看看如何在MySqlWell中高效地进行计算。您可以在mysql上创建该函数。