Hallo Sven,
Dazu frage ich erst alle Berater aus der Datenbank ab und in einer foreach-Schleife dann die Städte dazu.
Nun habe ich statt einer SQL-Anweisung (mit dem LEFT JOIN) ca. 370 SQL-Aufrufe.
Gibt es Berater, denen keine Städte zugeordnet sind?
Wenn ja, bist Du an diesen interessiert?
Wenn nein, warum verwendest Du einen LEFT JOIN?
Das Problem ist eindeutig die BETWEEN-Anweisung:
SELECT * FROM staedte WHERE $berater[plz] between plz_von and plz_bis
Das ist völlig logisch und normal. Du hast keine Join-Bedingung auf Gleichheit, die schnell Ergebnisse bringt, Du hast zwei Ungleichheitsbedingungen.
Die folgende "Optimierung" scheint mir fehlerhaft zu sein:
Deshalb habe ich die PHP-Datei nochmals überarbeitet:
$result_staedte = $db->query("SELECT * FROM staedte WHERE plz_von = $berater[plz]");
if (!mysql_num_rows($result_staedte)) {
$result_staedte = $db->query("SELECT * FROM staedte WHERE plz_bis = $berater[plz]");
}
if (!mysql_num_rows($result_staedte)) {
$result_staedte = $db->query("SELECT * FROM staedte WHERE $berater[plz] between plz_von and plz_bis");
}
Nun wird die BETWEEN-Anweisung erst ausgeführt, wenn die anderen zwei Anweisungen kein Ergebnis bringen. Nun habe ich 70 SQL-Abfragen mehr aber ich bekomme Ruck-Zuck ein Ergebnis.
Das gleiche wie vorher? Das gewünschte? Das bezweifle ich. Ich stelle mir vor, da gibt es eine Stadt, für die Berater von 60311 (Frankfurt) bis 66663 (Merzig) zuständig sind. Deine Vorgehensweise wird als einziges Resultat Berater aus 60311 Frankfurt liefern, nicht jedoch solche aus Merzig ...
Ein paar Ideen:
Was bringt Dir
SELECT
<sonstige spalten>,
b1.id as id, -- Gib mir alle Berater, die für
s.id as stadt_id -- eine bestimmte Stadt zuständig sind, weil
staedte s
INNER JOIN berater b1 ON s.plz_von <= b1.plz -- die PLZ ihres Ortes größer ist
-- als die Mindest-PLZ und
INNER JOIN berater b2 ON s.plz_bis >= b2.plz -- kleiner als die Maximal-PLZ
-- dieser Stadt
Wobei ich nicht erwarte, dass hier das Ergebnis viel besser ist als bei Deiner ursprünglichen Formulierung.
Weitere Idee:
Deine PHP-Schleife könntest Du (MySQL 5.x.y) in eine Stored Procedure in die DB verlagern ...
Daher meine beliebte Frage bei MySQL zum Schluß: Welche genaue Version verwendest Du? MySQL unterscheidet sich zwischen den verschiedenen Versionen enorm in seiner Leistungsfähigkeit.
Freundliche Grüße
Vinzenz