SQL查询查找彼此靠近的条目

时间:2014-08-11 08:42:27

标签: mysql sql sqlite

我有一个包含x,y位置列的数据库。我想得到一个列表,其中包含与数据库中任何其他条目接近的5个单位值内的另一个条目。毕达哥拉斯定理可以很容易地计算出两个条目之间的距离。但我不确定如何遍历所有其他条目以测试它是否位于数据库内对象的区域中。它与在SQL中使用SELECT-ing DISTINCT类似,但我希望允许一些错误/灵活性与其他条目匹配。使用SQL查询执行此操作的方法是什么?

2 个答案:

答案 0 :(得分:1)

您希望存在至少一个具有距离的其他行的所有行:

SELECT *
FROM MyTable AS T1
WHERE EXISTS (SELECT 1
              FROM MyTable AS T2
              WHERE T1.ID != T2.ID     -- never match with itself
                AND (T1.X - T2.X) * (T1.X - T2.X) +
                    (T1.Y - T2.Y) * (T1.Y - T2.Y)   <= 5 * 5)

使用连接可以完成同样的操作,但如果距离内有多个其他条目,则可以获得多个结果。 这可能是您想要的(如果您想获取两个条目的数据),或者您可以使用DISTINCT:

SELECT DISTINCT T1.*
FROM MyTable AS T1
JOIN MyTable AS T2 ON T1.ID != T2.ID
                  AND (T1.X - T2.X) * (T1.X - T2.X) +
                      (T1.Y - T2.Y) * (T1.Y - T2.Y)   <= 5 * 5

这两个查询都会匹配相同的条目两次,一次在T1,一次在T2。 如果您想避免获得两个结果,请将T1.ID != T2.ID替换为T1.ID < T2.ID

答案 1 :(得分:1)

如果我们假设您的表格包含字段idxy。并假设id是唯一的,因此查询列出您所描述的元素的ID应该是:

SELECT a.id FROM positions as a, positions as b WHERE a.id <> b.id AND ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)) < 25;

希望这有帮助