Hey gibt es eine Möglichkeit, eine Liste der nächsten 10 Ziele in der Reihenfolge ihrer Entfernung zu erhalten, hat meine MySQL-Datenbank die Breite und Länge des Benutzers und der Orte. Ich möchte nicht den Abstand zwischen dem Benutzer und dem Ort aka no max oder min Abstand angeben, nur die nächsten 10, die ich brauche. Beide Benutzer und Orte teilen sich die gleiche Tabelle.nächste 10 Ziele in der Reihenfolge ihrer Entfernung
Antwort
können Sie die Haversine Formel:
SELECT t.*, (6371 * ACOS(COS(RADIANS(lat_user)) * COS(RADIANS(lat)) *
COS(RADIANS(lng) - RADIANS(lng_user)) + SIN(RADIANS(lat_user)) *
SIN(RADIANS(lat)))) AS distance -- distance in kilometers
FROM yourTable
ORDER BY distance ASC
LIMIT 10
In der obigen Abfrage Ich gehe davon aus, dass lat_user
und lng_user
die Breite und Länge des Benutzers sind. Und lat
und lng
sind die Breite und Länge eines bestimmten Ortes (Datensatz).
Lesen Sie this SO question für weitere Informationen.
Außer, dass dies durch jeden einzelnen gehen wird Eintrag in die Datenbanktabelle .... der es sehr, sehr langsam machen wird ... Haversine ist eine teure, langsame Formel, um –
zu berechnen Ich bin nicht am Lat vorbei und lange am Ort, ich muss Orte aus der Datenbank holen –
@MarkBaker Ja, dies wird für eine große Datenbank mit häufigen oder vielen Benutzern nicht gut skalieren. Aber für ein paar hundert oder tausend Datensätze sollte es machbar sein. Eine Art von geographischer Aufteilung ist ein besserer Weg, um langfristig zu gehen. –
Ja - es ist möglich – RamRaider
Es gibt, aber es ist langsam .... und Sie können es effizienter machen, indem Sie eine Bounding Box angeben und eine Reihe von Abfragen mit immer größer werdenden Begrenzungsrahmen ausführen, bis Sie Ihre 10 haben Einträge –
Ich schrieb 10 zum Beispiel, eigentlich brauche ich mindestens 100, so ist es eine nicht eine gute Idee, die ich denke :( –