元の質問への回答:
これはあなたが探しているものを提供すると思います:
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 はそれらの間に必要な最小のキロメートルです。
残念ながら、このタイプのクエリはCartesian 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 はそれらの間に必要な最小のキロメートルです。