php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
U mkreissuche -> join auf kundendatenbank


 
Peacie
22-01-2009, 12:03 
 
Hallo Comunity,

ich habe mal wieder ein kleines Denkproblem.

Ich habe 2 Tabellen in einer Datenbank.
DIe Erste beinhaltet Postleitzahlen von GeoNames, die 2. beinhaltet Kundendaten.
Diese beiden Tabllen lassen nur anhand der PLZ miteinander verknüpfen.

Nun habe ich mir eine Funktion für die Umkreissuche geschrieben, die auch recht flott alle Werte die ich brauche aus der GeoDB zurückgibt.
Die Funktion gibt mir ein Array zurück, in dem unter anderem die PLZ der Orte im Umkreis steht. Aus Performancegründen kann ich hier eine maximale Anzahl an Antworten angeben.

Problem ist allerdings, das nicht alle PLZ in der GeoDB auch in unserer Kundendatenbank sind. (GeoDB ca 300.000 Datensätze, Kundendatenbank ca 5.000)

Mit einem InnerJoin auf die Kundendatenbank bei der Umkreissuche dauert die Abfrage einfach viel zu lange.
Das Array auf die Kundendatenbank jagen um zu sehen welche PLZ davon auch in der Kundendatenbank stehen würde das Ergenbniss (z.B. max 25 Datensätze) ja fäschen.

Habt Ihr einen schlauen Denkanstoss für mich ?

 
Peacie
22-01-2009, 13:21 
 
hab nun ein einigermaßen schnellen sql hinbekommen

trotzdem danke fürs lesen :)

 
ghostgambler
22-01-2009, 13:25 
 
Und was war dein Lösungsansatz?
Für Leute mit ähnlichen Problemen.

 
Peacie
22-01-2009, 13:53 
 
arbeite das kurz auf und poste gleich meinen code.
Hab nur noch ein kleines count problem :)

 
Peacie
22-01-2009, 15:16 
 
tja, da hab ich den mund wohl zu voll genommen :P

bin wieder am anfang und meine datenbank zeigt mir nen vogel.

die eigentlich recht schnelle abfrage nur an die geodn sieht so aus:

http://www.urlaubsuche-deutschland.de/geo1.php

code dazu:
http://www.urlaubsuche-deutschland.de/zeige.php


wenn ich nun einen innerjoin auf unsere kundendb einfüge:

inner join (select onummer, oort, oplz from `".DBTBLPREFIX."Objektstamm` ) AS b on a.plz = b.oplz

dauert die abfrage länger als ne tasse kaffee :)

 
ghostgambler
22-01-2009, 15:26 
 
Warum legst du nicht einfach einen Cache des Ergebnisses an?
Wenn ein neuer Kunde dazu kommt muss du natürlich den Cache entsprechend aktualisieren.


Ansonsten bietet sich noch ein ganz anderer Weg an:
Du koppelst Umkreissuche an PLZ. Das eine hat aber mit dem anderen spontan mal nix zutun. (20 Meter weiter ist bei mir ein anderer Ort, das ist zwar nah, die PLZ unterscheidet sich trotzdem schon ab der 3. Stelle).
Du kannst auch zu jedem Benutzer den Längen- und Breitengrad speichern (PLZ -> Grade) und dann mit einer tollen Formel, die du dir ergoogelst, alle Benutzer in einem Umkreis von einem bestimmten Punkt (den du dir erneut mit Längen- und Breitengrad spezifizierst) selektieren.

Du brauchst dann nur noch eine große DB, welche dir die PLZs auf die Grade mappt, und eine tolle Formel+hoffentlich mögliche Indizes auf deine sowieso vorhandene Tabelle.

 
Peacie
22-01-2009, 15:41 
 
danke für die fixe antwort.

ich versuchs mal andersrum zu erklären

ich brauche NICHT die geodaten (längen und breitengrad) von jedem kunden.
ich habe lediglich einen ort (anhand der plz) von dem ich ja mit meiner funktion get_lat_lon den längen und breitengrad bekomme.

nun brauche ich alle orte in einem bestimmten umkreis. funktioniert prima über die funktion umkreis.

das einzige was ich nun noch wissen muss ist, ob in diesen orten aus der funktion umkreis mindestens ein kunde sitzt.
also eine abfrage, ob die gefundene PLZ von umkreis in meiner kundendatenbank existiert
ist mit nem 2. sql kein problem.
aber:
wenn ich nun umkreis mit einer maximalen anzahl von 50 ergebnissen aufrufen will, danach den 2. sql auf meine kundendatenbank abschiesse, die wiederum aber nur 30 übereinstimmungen hat, könnte ich ja nie genau sagen, welche 50 orte denn nun in der nähe von dem ursprungsort sind in denen auch kunden sitzen.

ich hoffe ich habs möglichst schlau rüber gebracht :P

 
Peacie
22-01-2009, 17:13 
 
Für alle, die es noch interessiert.

ich habe die Abfrage nun doch mit einem 2. SQL abgeschickt


code dazu:
http://www.urlaubsuche-deutschland.de/zeige.php

ergebniss ist annehmbar schnell:

http://www.urlaubsuche-deutschland.de/geo1.php


ich brauche die postleitzahlen bzw die später daraus resultierenden orte für eine darstellung in google maps.
wer dazu noch fragen hat, möge mich einfach anschreiben :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:40 Uhr.