2016-08-12 1 views
-2

Ich habe zwei Tabellen, Benutzer und Orte, mit latitude und longitude. Für jeden Ort möchte ich Benutzer summieren, die sich in einem Abstand von x befinden.MySQL Summierung von Daten in Abhängigkeit von Entfernung Tabellen

Eine Möglichkeit, dies zu tun, ist das Schleifen. Gibt es einen anderen Weg, es zu tun? Wie erreiche ich das einfach in SQL?

Edit:

User(id, name, latitude, longitude) 

Place(id, name, latitude, longitude) 
+1

Sie sollten Ihre Tabellenstruktur bereitstellen, damit wir verstehen, wie sie sich beziehen, aber nein, Sie sollten a nicht benötigen Schleife. 'Join' und' Count' sind das was du suchst. – sgeddes

+0

https://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html – Nicarus

+1

Erforschen Sie die MySQL GIS-Erweiterungen. –

Antwort

0

scheint, wie ein Ansatz wäre eine Quer von „Benutzer“ verbinden und „Ort“ (bei jedem „user“ an jeder Stelle abgestimmt einen Ausdruck enthalten, die den Abstand zwischen den berechnet. "user" lat/long und "place" lat/long (GCD), und vergleichen Sie das Ergebnis vom Ausdruck mit der gegebenen Entfernung "x", und basierend auf diesem Vergleich eine 0 oder 1 zurückgeben. Und verwenden Sie ein SUM Aggregat von die Rückkehr aus dem Vergleich

Zum Beispiel so etwas wie folgt aus:.

SELECT p.id 
    , p.name 
    , IFNULL(SUM([gcd_expr] <= x) ,0) AS cnt 
    FROM place p 
CROSS 
    JOIN user u 
GROUP BY p.id 

Mit jedem Benutzer an jedem Ort angepasst, könnte das wirklich groß eingestellt werden. Und das sind viele zu kalkulierende Entfernungen, die unerschwinglich teuer sein könnten.

Zur Verbesserung der Leistung können wir schließen Joinvergleichselemente, die Deltas der Breite und/oder Länge beschränken ... sagen Sie nur überprüfen Benutzer möchten, die innerhalb von 5 Breitengrade sind ...

SELECT p.id 
    , p.name 
    , IFNULL(SUM([gcd_expr] <= x) ,0) AS cnt 
    FROM place p 
    LEFT 
    JOIN user u 
    ON u.lat-p.lat BETWEEN -5.00 AND 5.00 
GROUP BY p.id 

[gcd_expr] stellt den Ausdruck dar, der die Berechnung der Großkreisentfernung ausführt. (Es gibt Implementierungen davon verfügbar; suchen Sie nach vorhandenen Fragen auf StackOverflow, ich weiß, dass diese Frage mehrmals beantwortet wurde.)

Verwandte Themen