我不确定如何将代码导入到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.
这样的东西?
请注意!这是为了每周运行一次服务器端。
PS:php标签是因为我使用了一些PHP代码示例来尝试演示我的想法。
答案 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)