回答你原来的问题:
我认为这将为您提供您正在寻找的东西:
SELECT DISTINCT
a.id AS a,
b.id AS b,
ACOS(
SIN(a.lat) * SIN(b.lat) + COS(a.lat) * COS(b.lat) * COS(a.lon - b.lon)
) * 6371.01 AS km
FROM
restaurants a,
restaurants b
WHERE
b.id > a.id AND
ACOS(
SIN(a.lat) * SIN(b.lat) + COS(a.lat) * COS(b.lat) * COS(a.lon - b.lon)
) * 6371.01 >= X
ORDER BY
ACOS(
SIN(a.lat) * SIN(b.lat) + COS(a.lat) * COS(b.lat) * COS(a.lon - b.lon)
);
其中 X 是您希望它们之间的最小公里数。
不幸的是,这种类型的查询是返回笛卡尔 Product的CROSS JOIN,因此对于 10 家餐厅,您将进行 36 次比较,100 次您将获得 4,851 次比较,1,000 次您将获得 498,501 次等。
回答您修改后的问题:
要查找距离任何其他餐厅至少 X 公里的所有餐厅,请使用以下命令:
SELECT
a.id AS a,
MIN(ACOS(
SIN(a.lat) * SIN(b.lat) + COS(a.lat) * COS(b.lat) * COS(a.lon - b.lon)
) * 6371.01) AS km
FROM
restaurants a,
restaurants b
WHERE
b.id > a.id
GROUP BY
a.id
HAVING
MIN(ACOS(
SIN(a.lat) * SIN(b.lat) + COS(a.lat) * COS(b.lat) * COS(a.lon - b.lon)
) * 6371.01) >= X
ORDER BY
MIN(ACOS(
SIN(a.lat) * SIN(b.lat) + COS(a.lat) * COS(b.lat) * COS(a.lon - b.lon)
) * 6371.01)
其中 X 是您希望它们之间的最小公里数。