【问题标题】:Creating MySQL function to replace PHP code创建 MySQL 函数来替换 PHP 代码
【发布时间】:2012-11-26 15:31:24
【问题描述】:

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

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端实现这样一个功能的完全不同的方式?

【问题讨论】:

  • fetch 数组有什么问题?
  • 没什么,它很好用,但是它的数据库类和我的导师希望尽可能多地出现在数据库方面 - 他通过说它的可移植性来论证这个陈述,当你这样做时方式。
  • 使用PDO 可能吗?
  • 不要对所有显示的代码都是 PHP 的事实感到困惑。这个问题与PHP无关,他问的是MySQL存储例程。
  • 感谢您的建议,但我希望它是 mysql 存储的函数/过程。

标签: php mysql function


【解决方案1】:

这里是您可以开始的地方。这不是一个存储过程,但我看不出有什么问题:

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

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 注入。

【讨论】:

  • 谢谢你,这是我以前没有想到的,但效果很好!这是我使用您的代码存储的函数: 'DELIMITER $$ CREATE FUNCTION sampleFunc9( lat DOUBLE, lng DOUBLE ) RETURNS INT DETERMINISTIC BEGIN DECLARE result DOUBLE; SET 结果 = (SELECT iddriver FROM driver ORDER BY (driverpoint_lat - lat) * (driverpoint_lat - lat) + (driverpoint_lng - lng) * (driverpoint_lng - lng) ASC LIMIT 1);返回结果; END $$'
【解决方案2】:

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

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

answer 是一个很好的起点,它展示了数学函数如何在 MySQL 函数中使用,然后由 PHP 调用。请注意,这是使用 mysql_ 函数编写的,它们是 being deprecated。您应该使用mysqli_PDO 函数。

【讨论】:

  • 我听说最好避免存储函数/过程,但正如你所说,我一定会使用它们。是的,我希望函数像“CALL getLeastDistance($lat, $lng)”一样被调用,返回值将是最接近 lat 和 long 点指示的驱动程序的 ID。我去看看你给的链接,谢谢你的回复。
  • @DanielSzymatowicz 您应该自己尝试一下,然后我们可以为您提供帮助。无论如何,你需要一个函数,而不是一个存储过程。
  • 你给出的答案对我来说可能也是答案,我会检查一下。
【解决方案3】:

感谢@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 $$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多