Mysql 寻找最小距离

Mysql 寻找最小距离,mysql,sql,Mysql,Sql,我想找到特定macId和时间戳的(x2-x1)^2+(y2-y1)^2之间的最小距离。我想找一个最近的门 个人在某一特定时间的位置。因此,查询应该在一个时间实例中返回一个唯一的user值,即距离GATE位置的min 数据集如下所示: X1 Y1 TimeStamp MACID X2 Y2 Gate | 5618 | 5303 |1 12:22:02 | 54:ea:a8:53:5b:eb | 5844 | 5377

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

数据集如下所示:

   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
我也尝试过使用自连接,但似乎完全错误


我可以知道哪里出了问题。

您可以使用以下查询:

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 Fiddle:


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

您的结果似乎返回的是
MAX
,而不是
min
。感谢您的更正,但我正在寻找如何获得结果的逻辑。Min和Max没有任何区别,尽管“我已经尝试了下面的查询,但没有工作:”-为什么以及什么不工作?错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册中的“min”((snapX-poiX)*(snapX-poiX)+(snapY-poy)*(snapY-poy))groupby timeStamp”附近使用的正确语法,第1行:这是我得到的错误查询似乎适用于MySQL 5.6,但不适用于版本“5.5.44-0 ubuntu0.12.04.1”。有什么重大的改变需要做吗?你说它不起作用是什么意思?怎么了?我用MySQL 5.5测试了它,没有问题对不起,在复制查询时出现了一个输入错误。我正在等待结果出来,并将其标记为已回答。