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.)
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
https://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html – Nicarus
Erforschen Sie die MySQL GIS-Erweiterungen. –