php - 将 PHP 比较函数应用于 MySQL 表中的所有元素

标签 php mysql performance algorithm euclidean-distance

我正在构建一种算法,该算法采用欧几里得坐标(例如 (-4, 2))并搜索其他坐标的大型数据库表以找到最近的坐标(使用欧几里得距离公式)。目前,我的代码如下所示:

$x = -4;
$y = 2;
$query = mysql_query('SELECT `x`, `y` FROM `myTable`');
$closest = PHP_INT_MAX;
while($row=mysql_fetch_array($query)){
    $dist = distFormula($x, $y, $row[x], $row[y]);
    if($dist<$closest)
        $closest = $dist;
}
echo $closest;

distFormula($x1, $y1, $x2, $y2){
    return sqrt(pow($x2-$x1, 2)+pow($y2-$y1, 2));
}

有没有更有效的方法?我的数据库表可能非常大。有什么方法可以在查询中进行比较吗?此外,出于示例的目的,我在这种情况下使用了二维,但实际上我打算使用大量的维度(更长的坐标)。

感谢您的帮助!

最佳答案

是的,您可以在查询中的 MySQL 中进行此类计算。试试这个:

$query = <<<SQL
  SELECT * FROM (SELECT $x originX, $y originY, x closestX, y closestY, SQRT(
       ($x-x)*($x-x)
     + ($y-y)*($y-y)
  ) dist FROM `myTable`) a ORDER BY dist DESC LIMIT 1
SQL;

确保最后一行是单独的,开头或结尾没有其他字符。

它应该给出结果中 'dist' 列内的距离

这是一个包含 3 个维度的示例...

$query = <<<SQL
  SELECT * FROM (
      SELECT 
         $x originX, $y originY, $z originZ, 
         x closestX, y closestY, z closestZ 
         SQRT(
           ($x-x)*($x-x)
         + ($y-y)*($y-y)
         + ($z-z)*($z-z)
  ) dist FROM `myTable`) a ORDER BY dist DESC LIMIT 1
SQL;

关于php - 将 PHP 比较函数应用于 MySQL 表中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24473781/

相关文章:

string - 什么是 Swift String 到 NSString 的桥接开销?

windows - 是否有更好的客户端来查看系统监视器日志?

php - 限制购物车项目来自 WooCommerce 中的同一产品类别

php - 从 PHPDatabase : Message-like Algorithm 选择数据

mysql - 数据库表显示在列表中,但系统告诉我它们不存在

mysql - 多个表中的相同外键

php - WordPress 批量产品上传 (woocommerce) - 650K

php - 参数化 PDO 语句 : should trusted, 常量值是否被参数化?

MySQL触发器创建定时器

css - 重复访问者的 CSS Sprite 性能增益是多少?