2016-05-24 18 views
1

Unten ist meine postal Tabelle mit ein paar Aufzeichnungen. Tatsächlich enthält diese Tabelle alle Städte und alle Postleitzahlen.Wählen Sie Datensätze basierend auf der Postleitzahl und ihrem Radius in MySQL

id city     postalcode latitude   longitude 
1 Drogteropslagen  7705 PA  52.61666700  6.50000000 
2 Coevorden   7740 AA  52.66666700  6.75000000 
3 Emmen    7812 TN  52.78333300  6.90000000 
4 Emmer-Compascuum  7881 PZ  52.81666700  7.05000000 
5 Nieuw-Dordrecht  7885 AA  52.75000000  6.96666700 

Unten ist meine company Tabelle mit ihm Postleitzahl und der Radius in Kilometer sind, wo jedes Unternehmen in der Lage ist, seine Dienstleistungen zu erbringen.

id company_name city    postalcode radius latitude  longitude 
1 A    Emmen    7812 TN  10  52.78333300 6.90000000 
2 B    Nieuw-Dordrecht 7885 AA  5  52.75000000 6.96666700 
3 C    Drogteropslagen 7705 PA  25  52.61666700 6.50000000 
4 D    Foxhol   9607 PR  0  53.16666700 6.71666700 
5 E    Westerbroek  9608 PA  15  53.18333300 6.68333300 

Ich möchte die Unternehmen, die eine bestimmte Postleitzahl z. 7740 AA lebt im Bereich der Postleitzahl plus dem Radius einer Firma. Beachten Sie, dass die bestimmte Postleitzahl möglicherweise nicht immer in der Tabelle company vorhanden ist, aber immer in der Tabelle postal vorhanden ist. Wie schreibe ich eine SQL-Abfrage, um diese Unternehmen auszuwählen.

+0

Beginnen Sie mit einem Distanzalgorithmus – Strawberry

+0

@Strawberry Es wird kein Algorithmus benötigt, da er (intelligent) bereits den Längen- und Breitengrad für jede Firma zwischenspeichert. Stattdessen kann er die Entfernung mit der Havesine-Formel bestimmen. –

+0

Ok. Verwenden Sie einen Algorithmus, der nur aus einem einzigen Schritt besteht. – Strawberry

Antwort

1

Dieser Ansatz führt eine CROSS JOIN zwischen einer Unterabfrage mit einem einzigen Datensatz für das Unternehmen von Interesse gegen eine Unterabfrage, die jede Firma enthält. Die Abfrage verwendet die Haversine-Formel für die Berechnung der Entfernung zwischen zwei Unternehmen in Kilometern (und Sie können mehr darüber lesen here).

Diese Abfrage ist, was Sie verwenden würden, um alle Unternehmen in einem Umkreis von 20 km von der Postleitzahl 7740 AA zu erhalten.

SELECT 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 
FROM 
(
    SELECT p.latitude AS lat1, p.longitude AS lng1 
    FROM postal p 
    WHERE p.postalcode = '7740 AA' 
) t1 
CROSS JOIN 
(
    SELECT c.company_name, p.latitude AS lat2, p.longitude AS lng2 
    FROM company c INNER JOIN postal p 
     ON c.postalcode = p.postalcode 
) t2 
HAVING distance < 20 
+0

@Tim Biegeleisen: Wird es einfacher sein, wenn ich den Längen- und Breitengrad in der Unternehmenstabelle habe? –

+0

@OConnor Basierend auf den Daten in Ihrer Frage, sehe ich den Punkt nicht einmal in zwei separaten Tabellen. Aber du kannst meine Frage jetzt ausprobieren. –

+0

@TimBiegeleisen Ich sehe entweder keinen Sinn, Tische zu trennen, also habe ich den lat und lon den gleichen Tisch wie die Firma gestellt. Verhindere Verwirrung, ich habe eine neue Frage zu diesem Thema mit nur einer Datenbanktabelle hinzugefügt. –

0

Die Abfrage von Tim Biegeleisen inspiriert mich wie nach der Arbeitslösung zu finden.

SELECT 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, 
     t2.radius 
FROM 
    (
    SELECT p.latitude AS lat1, p.longitude AS lng1 
    FROM postal p 
    WHERE p.postalcode = '7894 AA' 
    ) t1 
    CROSS JOIN 
    (
    SELECT c.company_name, p.latitude AS lat2, p.longitude AS lng2, 
      c.radius 
    FROM company c 
    INNER JOIN postal p 
    ON c.postalcode = p.postalcode 
    ) t2 
HAVING distance < t2.radius 

Mit der obigen Abfrage wird der Abstand nicht mit einer festen Anzahl von Kilometern (beispielsweise 20 oder 50 km.), Aber mit dem dynamischen Radius (in km.) Den einzelnen Unternehmen vergleichen.