2

我想在数据库端而不是客户端有这样的循环:

while($result = mysql_fetch_array($exec)) {
    $pitagoras = sqrt(($result['driverpoint_lat']-$lat1)*($result['driverpoint_lat']-$lat1)+($result['driverpoint_lng']-$lng1)*($result['driverpoint_lng']-$lng1));

    if($pitagoras < $distance_least) {
        $distance_least = $pitagoras;
        $closest_driver = $result['iddriver'];
    }
}

mysql_fetch_array()如果我想从行中获取一些数据,或者可能以完全不同的方式在 mysql 端实现这样的功能,有什么方法可以替换?

4

3 回答 3

0

在我看来,您希望将其放入数据库中的函数或存储过程中,而不是在应用程序端进行。我不建议这样做。数据库并不意味着完成应用程序的工作。无论如何,既然您的导师要求这样做,请查看 MySQL 的数学函数

查看您发布的代码,您有位于应用程序端的变量 ( $lat1& $lng1)。你会把这些传递给函数吗?

这个答案是一个很好的起点,它展示了如何在 MySQL 函数中使用数学函数,然后由 PHP 调用。请注意,这是使用已弃用mysql_的函数编写的。你应该使用or函数。mysqli_PDO

于 2012-11-26T15:46:01.890 回答
0

这是您可以开始的地方。它不是存储过程,但我认为没有问题:

构建查询,使其返回一个距离,然后按所述距离排序:

SELECT iddriver, ..., 
(driver_lat - $lat) * (driver_lat - $lat) + 
(driver_lng - $lng) * (driver_lng - $lng) as dxd
FROM ... WHERE ...
ORDER BY dxd ASC

我将结果 dxd 命名为距离乘以距离,因为结果是相同的,并且您没有在每一行上运行 SQRT。

结果是一个司机列表,其中距离最短的司机在前。您也可以在其上使用 LIMIT。

注意:将其放入准备好的语句和/或通过 PDO 运行它并不难。底线要注意 SQL 注入。

于 2012-11-26T16:42:30.393 回答
0

谢谢@andreshernandez,这是我以前没有想到的,但效果很好!我写在这里是因为我不能用''格式化文本

这是我使用您的代码存储的函数:

  DELIMITER $$ 
  CREATE FUNCTION sampleFunc9( lat DOUBLE, lng DOUBLE ) 
  RETURNS INT 
  DETERMINISTIC 
  BEGIN 
  DECLARE result DOUBLE; 
  SET result = (SELECT iddriver FROM driver ORDER BY (driverpoint_lat - lat) * (driverpoint_lat - lat) + (driverpoint_lng - lng) * (driverpoint_lng - lng) ASC LIMIT 1); 
  return result; 
  END $$
于 2012-11-26T17:54:50.170 回答