Menu

Vergleichsabfrage - BITTE HELFT MIR

2008-06-05
2013-05-28
  • Norbert Fryer

    Norbert Fryer - 2008-06-05

    Hallo liebe Fachleute,

    ich bin nun schon seit Wochen mit der OpenGeoDB zugange und hänge an einer Sache fest.

    Das will ich erreichen:
    User gibt PLZ und Umkreis ein und die Datenbank liefert die entsprechenden PLZ im Umkreis.

    Das kriege ich hin mit:

    $result1 = dbquery("SELECT zip_code_b.text_val AS zip_code_b,
    acos( sin( coord_b.lat * PI( ) /180 ) * sin( coord_a.lat * PI( ) /180 ) + cos( coord_b.lat * PI( ) /180 ) * cos( coord_a.lat * PI( ) /180 ) * cos( coord_b.lon * PI( ) /180 - coord_a.lon *
    PI( ) /180 ) )* 6380 as Entfernung
    FROM geodb_textdata AS zip_code_a
    JOIN geodb_coordinates coord_a ON coord_a.loc_id = zip_code_a.loc_id
    JOIN geodb_textdata AS zip_code_b ON zip_code_b.text_type =500100000
    JOIN geodb_coordinates coord_b ON coord_b.loc_id = zip_code_b.loc_id
    WHERE zip_code_a.text_type =500100000
    AND zip_code_a.text_val = $user_plz
    AND acos( sin( coord_b.lat * PI( ) /180 ) * sin( coord_a.lat * PI( ) /180 ) + cos( coord_b.lat * PI( ) /180 ) * cos( coord_a.lat * PI( ) /180 ) * cos( coord_b.lon * PI( ) /180 - coord_a.lon * PI( ) /180 ) ) *6380 < $user_umkreis
    ORDER BY Entfernung");

    Soweit so gut, das System wirft brav alle passenden PLZ aus.

    Also weiter...

    Ich eröffne eine Tabelle, wo alle "Treffer", also die PLZ im Umkreis reinkommen.

    Das kriege ich hin mit:

    if(mysql_num_rows($result1))
             { 
            $sql="CREATE TABLE treffer (treffer_id INTEGER NOT NULL AUTO_INCREMENT, Postleitzahl INT(5) NOT NULL, Entfernung FLOAT(10) NOT NULL, PRIMARY KEY (treffer_id)) TYPE=InnoDB";
            dbquery ($sql) or die ("Konnte Tabelle nicht anlegen!");
           
                      
            while($row = mysql_fetch_assoc($result1))
             {
             $current1 = mysql_fetch_assoc($result1);
             $zip = $current1['zip_code_b'];
             $ent = $current1['Entfernung'];
             $sql="INSERT INTO treffer (Postleitzahl, Entfernung) VALUES ('".$zip."','".$ent."')";
             dbquery ($sql) or die ("Das Speichern war nicht erfolgreich!");
             }

    Auch prima. Die Kontrolle in der Datenbank zeigt, dass er brav alle passenden PLZ im Umkreis mit der errechneten Entfernung gespeichert hat.

    Nun kommts...

    Jetzt möchte ich die "Treffer" (also die PLZ, die im gewünschten Umkreis liegen) mit meiner Händler-Datenbank vergleichen.
    Also: Nimm die erste "Treffer-PLZ" und guck in der Händler-Datenbank nach, ob ein Händler dort eben diese PLZ hat. Wenn dem so ist, gebe den passenden Händlerdatensatz mit Entfernung aus und weiter gehts zur nächsten "Treffer-PLZ".

    Das habe ich so probiert:

    $result2 = dbquery("SELECT Center, PLZ, Postleitzahl, Entfernung
            FROM treffer
            JOIN center_datenbank ON PLZ = treffer.Postleitzahl
            ORDER BY Entfernung");
           
            while ($row = mysql_fetch_assoc($result2))
            {
            $current2 = mysql_fetch_assoc($result2);
            echo $current2['Center'];
            echo "<br />";
            echo $current2['PLZ'];
            echo $current2['Postleitzahl'];
            echo "<br />";
            echo $current2['Entfernung'];
            echo "<br /><br />";
            }

    Die Abfrage funktioniert soweit, er wirft mir auch Ergebnisse aus der Händlerdatenbank aus.

    Nun das Problem:
    Er wirft mir nicht ALLE passenden Händler raus.

    Will heissen:
    Obwohl er in der 1. Abfrage im Umkreis von 40595 u.a. die PLZ 40597 richtig gefunden und in die Treffer-Datenbank geschrieben hat, wirft er mir bei der 2. Abfrage (also Abgleich mit der Händlerdatenbank) nicht den passenden Händler-Datensatz aus.

    Obwohl die PLZ in der TREFFER-Tabelle UND in der HÄNDLER-Tabelle in gleicher Form existiert, wirft er den passenden Händler nicht aus.

    Wie gesagt: Die allermeisten Abfragen funktionieren einwandfrei, der "unterschlägt" mir nur zahlreiche Übereinstimmungen mit der Händler-PLZ, entsprechend lückenhaft und damit sinnlos ist das Ergebnis.

    Habt Ihr einen Rat für mich, bevor ich noch wahnsinnig werde?

    Norbert

     
    • Martin Trautmann

      Mein eigener Ansatz für http://fa-technik.adfc.de/code/anbieter läuft anders:

      Als erstes errechne ich die Koordinaten der Such-PLZ (oder suche als allererstes nach der nächsthöheren PLZ, wenn eine nicht bekannte PLZ eingegeben wird)

      Dann gehe ich direkt zum Händlerverzeichnis. Dort stehen mir drei Koordinatenquellen zur Verfügung
      1) genauere Koordinaten des Händlers selbst
      2) PLZ-Angabe aus der Anschrift
      3) zusätzliche PLZ-Angaben zum Verteilungsgebiet (z.B. Filialen, Wirkungskreis)

      Damit berechne ich direkt die Entfernung zwischen Ausgangskoordinate und Händlerdaten und speichere den Min-Wert des Händlers. Beim Durcharbeiten von 2) und 3) können die Entfernungsangaben einer Hash-Tabelle hinzugefügt werden, um bei nochmaliger Prüfung nicht nochmals berechnet werden zu müssen. Andernfalls werden die PLZ-Koordinaten aus der PLZ-Tabelle entnommen und die Entfernung berechnet.

      Ergänzt wird das durch die Ausnahme, dass Such- und Händler-PLZ gleich sind. Dann wird die Entfernung auf Null gesetzt.

      Mit SQL-Abfragen kann ich dir nicht helfen - bei mir läuft das als Perl-Script ab.

      Schönen Gruß
      Martin

       

Log in to post a comment.