2016-07-30 30 views
-1

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

+0

Ja - es ist möglich – RamRaider

+0

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 –

+0

Ich schrieb 10 zum Beispiel, eigentlich brauche ich mindestens 100, so ist es eine nicht eine gute Idee, die ich denke :( –

Antwort

2

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.

+0

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 –

+0

zu berechnen Ich bin nicht am Lat vorbei und lange am Ort, ich muss Orte aus der Datenbank holen –

+0

@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. –