Hallo.
Performance ist in der Tat das wichtigere Argument, auch wenn ich lieber mehrere SQL-Abfragen hätte, weil mir das übersichtlicher erscheint (was sicher´lich eine frage der Formatierung ist). Abgesehen davon befürchte ich, das mir bei einer Mega-SQL die while-Funktion, die ich ansonsten bei den 5 Abfragen hätte, verloren geht.
Aber ich bau das Ding mal und schaue was passiert.
Falls es noch eine andere Idee gibt, hier mal mein Code (und Problem):
Ich habe eine dreistellige Zahl, mit der eine Region angegeben wird, z.B.
$reg_nr = '123'; //soll heißen "1" für die Stadt, "2" für den Stadtbezirk und "3" für den Stadtteil.
Nun will ich (alphabetisch sortiert!) alle Adressen bzw. Namen ausgeben lassen, die in dieser Region wohnen (und dabei ein weiteres Kriterium, nämlich der Zugehörigkeit zu einer Gruppe, erfüllen)
Dazu wird
1.
in einer Tabelle t_kontaktgruppen herausgesucht, welche Gruppen (wie "Gewerbe", "Behörde" o.ä.) es überhaupt gibt (unter denen später die jeweiligen Kontakte aufgelistet werden sollen).
Code: Alles auswählen
$sqlkona = "SELECT * FROM t_kontaktgruppen WHERE public1 >= 1";
$resultkona = $db->sql_query($sqlkona);
while ($rowkona = $db->sql_fetchrow($resultkona ))
{ $kona = $rowkona ['kontaktgruppe'] ;
$konaid = $rowkona ['id_kontaktgruppe'] ;
2.
Während die while-Schleife noch läuft wird in der zweiten Abfrage in einer Tabelle t_z_kontaktgruppen danach gesucht, welche Kontakt-IDs zu den Gruppen gehören:
Code: Alles auswählen
$sqlkona2 = "SELECT * FROM t_z_kontaktgruppen WHERE kontaktgruppen_id = $konaid";
$resultkona2 = $db->sql_query($sqlkona2);
while ($rowkona2 = $db->sql_fetchrow($resultkona2 ))
{ $kona2id = $rowkona2 ['kontakt_id'] ;
3.
Während auch diese while-Schleife noch weiterläuft, hole ich aus der Tabelle t_kontakte die Bezeichnungen bzw. die Namen der gesuchten Personen (die Abfrage könnte bzw. sollte auch später gemacht werden, da ansonsten mehr Daten als für das Endergebnis benötigt umgewälzt werden):
Code: Alles auswählen
$sqlkona3a = "SELECT * FROM t_kontakte WHERE id_kontakt = $kona2id AND public = 1";
$resultkona3a = $db->sql_query($sqlkona3a);
while ($rowkona3a = $db->sql_fetchrow($resultkona3a ))
{ $kona3a = $rowkona3a ['bezeichnung'] ;
$kona3a_id = $rowkona3a ['id_kontakt'] ;
Jetzt habe ich zwar alle Kontakte unter den Gruppen, aber weder sortiert noch einem wesentlichen Kriterium entsprechend, nämlich der regionalen Zuordnung.
4.
Dazu muss in der Tabelle t_kontaktdetails die Straßennummer des jeweiligen Kontaktes geholt werden (um danach mit Abfrage der Tabelle t_strassen die Ortsteilnummer = gesuchte $regions_id zu finden). Um aber an die Details zu kommen, muss vorher die Kontakt-ID in der Tabelle t_z_kontaktdetails gesucht werden, also
Code: Alles auswählen
$sqlkona3 = "SELECT * FROM t_z_kontaktdetails WHERE kontakt_id = $kona2id AND public = 1";
$resultkona3 = $db->sql_query($sqlkona3);
while ($rowkona3 = $db->sql_fetchrow($resultkona3 ))
{ $kona3 = $rowkona3 ['kontaktdetail_id'] ;
5.
Jetzt also die Suche nach den Kontaktdetails:
Code: Alles auswählen
$sqlkona4 = "SELECT * FROM t_kodetails WHERE id_kodetail = $kona3 AND public = 1"; $resultkona4 = $db->sql_query($sqlkona4);
while ($rowkona4 = $db->sql_fetchrow($resultkona4 ))
{ $kona4 = $rowkona4 ['str_id'] ;
Jetzt wurden mir also zu jedem Kontakt (einer Gruppe) die Straßen-IDs genannt.
6.
Wenn jetzt die zu der Straßen-ID zugehörige regions_id mit der $reg_nr übereinstimmt, die ich ganz oben gegeben habe, dann erst sollen alphabetisch die Namen der Kontakte ausgegeben werden:
Code: Alles auswählen
$sqlkona3 = "SELECT * FROM t_strassen WHERE id_str = $kona4 AND Left(regions_id,2)= $reg_nr ";
$resultkona3 = $db->sql_query($sqlkona3);
while ($rowkona3 = $db->sql_fetchrow($resultkona3 ))
...
$template->assign_block_vars ...
Da also der template-Aufruf nur (in der while-Schleife) erfolgt, wenn es eine Übereinstimmung mit der regions_id gibt, hätte ich so mein Ergebnis, aber eben nicht alphabetisch sortiert:-(