Sortierung aus x-ter while-Schleife übernehmen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Sortierung aus x-ter while-Schleife übernehmen

Beitrag von webazubi »

Ahoi.
Sehe ich es richtig, dass bei nachfolgendem Code die Sortierung der zweiten sql-Abfrage nach dem Feld zeitstempel deswegen nicht klappt, weil die Reihenfolge schon (unaufgefordert) in der ersten Abfrage festgelegt wird?
Wenn ja, wie kann ich das ändern? Hatte an UNION-Abfrage gedacht, aber teilweise brauche ich die Sortierreihenfolge aus einer vierten oder fünften while-Schleife - da wird es schwer, alles mit UNION aufzubauen.
Wie kann ich also die gewünsche Sortierung der zweiten Abfrage für die Ausgabe der Daten festlegen?
In ein Array schreiben hatte ich auch schon probiert, komme dann aber nicht weiter, wenn ich x Arrays habe, die sich nicht kombinieren lassen.
Ich hatte auch schon meine Abfragen umgestellt, so das die zweite Abfrage als erste läuft. Dann stimmte zwar die Sortierung, aber der Weg um die anderen Abfragen einzubauen war zu umständlich.

Irgendeine Idee?

Code: Alles auswählen

$sql_kontakteb    = "SELECT * FROM t_z_kontaktbeitrag WHERE kontakt_id = $kontakt_id ";
$result_kontakteb = $db->sql_query($sql_kontakteb);
while ($rowb = $db->sql_fetchrow($result_kontakteb))
	{	
	$beitrags_id = $rowb['beitrags_id'];

$sql_kontaktebb    = "SELECT * FROM t_beitrag WHERE id_beitrag = $beitrags_id ORDER BY zeitstempel DESC";
$result_kontaktebb = $db->sql_query($sql_kontaktebb);				

while ($rowbb = $db->sql_fetchrow($result_kontaktebb))
{
$beitrags_titel = $rowbb['titel'];
$beitrags_zeit = $rowbb['zeitstempel'];

	$template->assign_block_vars('beitrage', array(
						'BEITRAG_TI' => $beitrags_titel,
						'BEITRAG_ZEIT' => $beitrags_zeit
		
			));
}
}
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Beitrag von cYbercOsmOnauT »

Und wie wäre es mit dieser SQL?

Code: Alles auswählen

SELECT tb.* FROM t_z_kontaktbeitrag AS tz, t_beitrag AS tb
  WHERE tz.kontakt_id = $kontakt_id
    AND tb.id_beitrag = tz.beitrags_id
  ORDER BY tb.zeitstempel DESC

P.S.: Wieso eigentlich UNION?

Grüße,
Tekin
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Beitrag von webazubi »

cYbercOsmOnauT hat geschrieben:Und wie wäre es mit dieser SQL?
Ja, statt der zweiten und vielleicht auch noch dritten Schleife ließe sich eine "große" SQL-Abfrage wie oben (oder mit UNION) wohl machen, aber ich benötige die Sortierung aus einer 5. UnterAbfrage und hoffte es würde sich vermeiden lassen, eine so lange SQL-Abfrage schreiben zu müssen.
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Beitrag von cYbercOsmOnauT »

Nun was ist Dir wichtiger? Eine ellenlangen SQL-Query zu senden (einmalig) oder lieber zich kleine Queries? Man sehe das auch einmal aus der Sicht der Performance. 100 kleine Queries sind auf jeden Fall sehr viel langsamer als ein Query das vielleicht 5 oder 10 Zeilen "lang" ist.
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Beitrag von webazubi »

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:-(
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

So wie es aussieht, solltest du dich mal mit dem JOIN Befehl befassen...
KB:knigge
Antworten

Zurück zu „Coding & Technik“