Seite 1 von 1

Sortierung aus x-ter while-Schleife übernehmen

Verfasst: 24.03.2007 01:42
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
		
			));
}
}

Verfasst: 24.03.2007 12:49
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

Verfasst: 25.03.2007 22:19
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.

Verfasst: 26.03.2007 01:33
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.

Verfasst: 28.03.2007 16:54
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:-(

Verfasst: 28.03.2007 17:24
von Pyramide
So wie es aussieht, solltest du dich mal mit dem JOIN Befehl befassen...