找到最小距离MYSQL

时间:2015-08-03 07:52:09

标签: mysql sql

我想找到特定macId和timeStamp的(x2-x1)^ 2 +(y2-y1)^ 2之间的最小距离。我试图找到最近的可能门 在一个特定时间的个人的位置。因此,查询应该在GATE位置的最小时间返回一个唯一的user值。

数据集如下:

   X1       Y1    TimeStamp    MACID               X2    Y2      Gate
| 5618  | 5303 |1 12:22:02 | 54:ea:a8:53:5b:eb | 5844  | 5377  | C24
| 5848  | 5046 |1 12:22:02 | 54:ea:a8:53:5b:eb | 5844  | 5377  | C18
| 6094  | 5464 |1 12:22:02 | 54:ea:a8:53:5b:eb | 5844  | 5377  | C17
| 6021  | 6540 |1 13:09:48 | 48:5a:3f:6a:01:b9 | 6210  | 6801  | C23
| 6366  | 7036 |1 13:09:48 | 48:5a:3f:6a:01:b9 | 6210  | 6801  | C14
| 6366  | 7036 |1 13:09:48 | 48:5a:3f:6a:01:b9 | 6210  | 6801  | C13

结果集应如下所示:

   X1       Y1    TimeStamp    MACID               X2    Y2      Gate
| 5848  | 5046 |1 12:22:02 | 54:ea:a8:53:5b:eb | 5844  | 5377  | C18
| 6021  | 6540 |1 13:09:48 | 48:5a:3f:6a:01:b9 | 6210  | 6801  | C23

我已尝试过以下查询,但无法正常工作:

select min((x2-x1)^2 + (y2-y1)^2), macID, timeStamp from maptable 
groupbymacID, timeStamp

我也尝试使用自联接,但似乎完全错误。

我可以知道我哪里出错了。

1 个答案:

答案 0 :(得分:0)

您可以使用此查询:

SELECT m.*
FROM maptable m, (
  SELECT TimeStamp, macid, MIN(POW((x2-x1), 2) + POW((y2-y1), 2)) mindist
  FROM maptable
  GROUP BY TimeStamp, macid
) a
WHERE m.TimeStamp = a.TimeStamp AND m.macid = a.macid
 AND POW((x2-x1), 2) + POW((y2-y1), 2) = a.mindist;

SQL小提琴:http://sqlfiddle.com/#!9/d7979/6

但请注意,每个macid和date不会返回一行,因为在输入数据中最后两行是相同的,因此对于门C13和C14,最小距离是相同的