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");
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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