我正在构建一种算法,该算法采用欧几里得坐标(例如 (-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/