2016-05-24 6 views
2

Unten ist mein company Tisch mit ihm postalcode ist, lat, lon und die radius in Kilometern, wo jedes Unternehmen seine Dienste anbieten kann.Wählen Sie Datensätze basierend zipcode, es ist Radius, lat und lon in MySQL

id company_name city     postalcode radiu latitude  longitude 
1 A    Drogteropslagen  7705 PA  10  52.61666700 6.50000000 
2 B    Coevorden   7740 AA  15  52.66666700 6.75000000 
3 C    Emmen    7812 TN  5  52.78333300 6.9000000 
4 D    Emmer-Compascuum  7881 PZ  25  52.81666700 7.05000000 
5 E    Nieuw-Dordrecht  7885 AA  60  52.75000000 6.96666700 

Ich möchte die Unternehmen, die eine bestimmte Postleitzahl z. 7813 AB lebt in ihrem postalcode + die radius, auch diese Postleitzahl 7813 AB ist nicht genau das gleiche wie das einer Firma. Wie schreibe ich eine SQL-Abfrage, um diese Unternehmen auszuwählen?

+1

Wie lautet Ihre erwartete Ausgabe dieses Datensamples? – sagi

+2

@sagi Er hat diese Frage bereits gestellt [hier] (http://stackoverflow.com/questions/37404372/select-records-by-zipcode-and-its-radius-in-mysql/37404516?noredirect=1#comment62325499_37404516) , gab mir aber nie die neue Verbindung. –

+0

@sagi Ich erwarte mindestens Datensatz ID = 3 und 5, weil die Postleitzahl 7813 AB ist in der Nähe 7812 TN und für die Datensatz-ID = 5, weil es Radius ist 60 km., Ziemlich lang, so die Postleitzahl 7813 AB sollte leben in diesem Bereich. Es ist nur eine Idee. Schließlich basiert es auf der Berechnung von lat und lon plus dem Radius dieser Unternehmen. –

Antwort

2
SELECT t1.company_name, t2.company_name, 
    (6371 * acos(cos(radians(t1.lat1)) * cos(radians(t2.lat2)) 
    * cos(radians(t2.lng2) - radians(t1.lng1)) + sin(radians(t1.lat1)) * sin(radians(t2.lat2)))) AS distance, 
    t1.radius 
FROM 
(
    SELECT company_name, latitude AS lat1, longitude AS lng1, 
     radius 
    FROM company 
    WHERE postalcode = '7813 AB' 
) t1 
CROSS JOIN 
(
    SELECT company_name, latitude AS lat2, longitude AS lng2 
    FROM company 
) t2 
HAVING distance < t1.radius AND t1.company_name != t2.company_name 
+0

danke für den Versuch, mir zu helfen. Ich versuche herauszufinden, wo der bestimmte postcalcode als Bedingung z. wo Postleitzahl = "7813 AB"; weil diese Postleitzahl von der Endbenutzereingabe kommt. –

+0

Ersetzen Sie 'WHERE c.company_name = 'A'' mit' WHERE Postleitzahl =' 7813 AB'' in der ersten Unterabfrage. –

+0

Ich habe den folgenden SQL-Fehler: # 1054 - Unbekannte Spalte 'Entfernung' in 'Where-Klausel'. Es scheint, dass der Alias-Abstand nicht funktioniert. –

0

Sie räumliche Datentypen für longitude und latitude (oder wandeln sie) verwenden können, und dann die Differenz mit st_difference berechnen, https://dev.mysql.com/doc/refman/5.7/en/spatial-operator-functions.html#function_st-difference

Beispiel siehe:

SELECT st_distance(POINT(50.0, 8.0), POINT(latitude, longitude)) FROM company; 

Der Abstand ist jedoch eine Annäherung und funktioniert am besten für kleine Entfernungen. Bei größeren Entfernungen erhöht sich der Berechnungsfehler aufgrund der Tatsache, dass MySQL nur planare Koordinaten berechnet (euklidische Geometrie).

+0

Können Sie mir anhand meiner obigen Datenbanktabelle einige Abfragebeispiele anzeigen? –

+0

Ich habe einen Beispielcode hinzugefügt. –

0

Sie müssen die Eingabe Postleitzahl in Long/Lat-Koordinaten konvertieren.

Es gibt zwei Möglichkeiten, dies zu tun; Der performanteste Weg besteht darin, eine Tabelle mit Postleitzahl und Long/Lat-Koordinaten zu importieren. Sie können eine dataset hier für die Niederlande finden.

Die Alternative besteht darin, eine Geocodierungs-API zu verwenden; es gibt mehrere verfügbar; Google ist dein Freund. Dies kann zu einem Leistungsproblem führen (wenn Tausende von Kunden gleichzeitig Postcodes übermitteln) und möglicherweise eine Lizenzierung vom API-Anbieter erfordern.

Sobald Sie den Long/Lat für Ihre Eingabe-Postleitzahl haben, können Sie geo-räumliche Logik in MySQL verwenden, um zu berechnen, was im Radius ist.

+0

Wie geo-räumliche Logik in MySQL zu verwenden? –

Verwandte Themen