用MySQL查询做半复杂的数学运算

时间:2017-06-19 07:44:19

标签: php mysql sql database

我不确定如何将代码导入到stackoverflow中的表格,所以我会在下面导入2张照片。

这些是我需要在查询中使用的表格的屏幕截图。我想将比赛“experts_coordinates”与用户coordinate_x和_y进行比较,看看谁是最接近的,因而是胜利者。

我不知道如何在SQL中写这个,但这是我的想法:

//Loop through all the results and do as follow

$user_xy = coordinate_x + coordinate_y;
$expert_xy = explode(',', 'experts_coordinates');
$winning_coords = $expert_xy[0] + $expert_xy[1];
$results = $user_xy - $winning_coords;

//Loop again too see who was the closest too '0'.
//Winner will be the users closest too 0.

这样的东西?

  

请注意!这是为了每周运行一次服务器端。

Users table with coordinates

Competition table with winning coordinates

PS:php标签是因为我使用了一些PHP代码示例来尝试演示我的想法。

2 个答案:

答案 0 :(得分:0)

要查找具有xy坐标的最近节点,使用欧几里德距离可能很有用:

function euclidDistanceSquared (a, b) {
  return (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]);
}

$user_xy = array(coordinate_x, coordinate_y);
$expert_xy = explode(',', 'experts_coordinates');
$dsquared = euclidDistanceSquared($user_xy, $expert_xy);

//find smallest dsquared using a loop

答案 1 :(得分:0)

在SQL中,我们不考虑循环,而是集合。阅读所有记录并按照所需坐标的顺序进行排序。至于数学:那是毕达哥拉斯,对吧?好吧,应用你喜欢的任何一个公式。

select 
  mytable.*,
  sqrt(pow(abs(mytable.coordinate_x - desired.x), 2) + 
       pow(abs(mytable.coordinate_y - desired.y), 2)) as distance
from mytable
cross join 
(
  select 
    cast(substring_index(experts_coordinates, ',', 1) as unsigned) as x,
    cast(substring_index(experts_coordinates, ',', -1) as unsigned) as y
  from experts_table
  where id = 1
) desired
order by pow(abs(mytable.coordinate_x - desired.x), 2) + 
         pow(abs(mytable.coordinate_y - desired.y), 2)