Answer to your original question:
I think this will provide you what you are looking for:
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)
);
where X is the minimum kilometers you want between them.
Unfortunately, this type of query is a CROSS JOIN returning a Cartesian Product, so with 10 restaurants, you'll have 36 comparisons, 100 you'll have 4,851, 1,000 you'll have 498,501, etc.
Answer to your revised question:
To find all restaurants that are at least X kilometers away from any other restaurant, use this:
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)
where X is the minimum kilometers you want between them.