How to Best Implement nearest neighbour search in mysql?
As far as design patterns, the Yelp question is pretty standard stuff.
For a more complex answer, you will probably need the geospatial distance. Here is a fascinating powerpoint about that topic (and here is a pdf version of that as well). However, the math involved is quite ugly.
From their slide:
set @orig_lat=122.4058; set @orig_lon=37.7907;
set @dist=10;
SELECT *, 3956 * 2 * ASIN(SQRT(
POWER(SIN((@orig_lat - abs(dest.lat)) * pi()/180 / 2), 2) + COS(@orig_lat * pi()/180 ) * COS(abs(dest.lat) * pi()/180) * POWER(SIN((@orig_lon – dest.lon) * pi()/180 / 2), 2) )) as distance
FROM hotels dest
having distance < @dist
ORDER BY distance limit 10
There's a longer, more in-depth answer about geospatial distance on Stack Overflow.
But you still want to limit the results by latitude and longitude.
Ultimately, I would avoid the POINT datatype and go with latitude/longitude. There's currently no way to determine the distance between two POINTs, so you're going to have to store latitude/longitude for that calculation anyways.
One last link: you may also want to check out this SO thread regarding speeding up the queries using spatial indexes.
Point datatypes are OK; you can just invoke X(coord)/Y(coord) to get the Lat/Lon values.
For example:
SELECT id,
(3959
* acos(
cos(radians(37))
* cos(radians(Y(coord)))
* cos(radians(X(coord)) - radians(-122))
+ sin(radians(37))
* sin(radians(Y(coord)))
)
) AS distance
FROM markers HAVING distance < 25
ORDER BY distance LIMIT 20;
Find the 100 restaurants nearest to some coordinate: See efficient code in http://mysql.rjweb.org/doc.php/latlng It includes a stored function for computing "great cirle" distance.
Better discussion: http://mysql.rjweb.org/doc.php/find_nearest_in_mysql This lists 5 ways, including the above one.