[Erledigt] SQL Abfrage sortieren

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.
Benutzeravatar
bgx
Mitglied
Beiträge: 228
Registriert: 30.11.2005 22:32
Kontaktdaten:

[Erledigt] SQL Abfrage sortieren

Beitrag von bgx »

Hallo!

Ich hab ein Problem mit dem sortieren von einem Datensatz.

Hier mein Script:

Code: Alles auswählen

if ($forum_row['forum_sort'] == "SORT_ALPHA")
{
	$topic_order = "t.topic_picture DESC, t.topic_title ASC";
}
else
{
	$topic_order = "t.topic_last_post_id DESC";
}
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time, p2.post_edit_time
	FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
	WHERE t.forum_id = $forum_id
		AND t.topic_poster = u.user_id
		AND p.post_id = t.topic_first_post_id
		AND p2.post_id = t.topic_last_post_id
		AND u2.user_id = p2.poster_id
		AND t.topic_type = " . POST_STICKY . "
		$limit_topics_time
		$ignore_tarbed
	ORDER BY $topic_order
	LIMIT $start, ".$board_config['topics_per_page'];
Sinn ist es, wenn ein Bild eingetragen ist, das er diese Topics als erstes anzeigen soll. Nun soll er aber das ganze nach dem Alphabet sortieren und nicht rückwärts wie hier. Problem ist dann, das er die leeren Felder als erstes bringt.

Gibt es da eine Lösung in SQL so nach dem Motto ORDER BY ... WHERE t.topic_picture <>'' ?
Zuletzt geändert von bgx am 18.12.2006 21:19, insgesamt 1-mal geändert.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Ich sehe bei Dir nicht durch. Kannst Du die "leeren Felder" nicht über WHERE außschließen? ORDER BY ... = ... kommt nach WHERE und vor DESC, falls nötig.
Benutzeravatar
bgx
Mitglied
Beiträge: 228
Registriert: 30.11.2005 22:32
Kontaktdaten:

Beitrag von bgx »

Klar kann ich die ausschliessen :lol: , möchte ich aber nicht, da Sie ja nach den gefüllten Sätzen angezeigt werden sollen.

z.B.

topic_picture Name
affe.jpg Affe
zebra.jpg Zebra
Frage zum Affen
Hilfe für Zebras


so soll es aussehen!

Also alphabetisch von a-z zuerst die mit topicpicture und dann die ohne!
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Und erst alle mit Bild und dann alle ohne in zwei Abfragen willst Du nicht?

PS: Du kannst auch nach mehr als ein was sortieren lassen, ich weiß bloß nicht ob es möglich ist, das eine in richtiger und das andere umgekehrter Reihenfolge zu sortieren. Ausprobieren!
Benutzeravatar
bgx
Mitglied
Beiträge: 228
Registriert: 30.11.2005 22:32
Kontaktdaten:

Beitrag von bgx »

In zwei Abfragen geht schlecht, wegen der Pagination (LIMIT).

Wie gesagt von z-a geht es ich will es halt nur umgekehrt. Weis aber nicht, wie ich es richtig rum machen kann. Geht das mit GROUP BY???
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Was ist mit UNION ? Du könntest die beiden Abfragen Trennen (erst alle mit Bild, dann alle ohne Bild), dann bei beiden eine fiktive zusätzliche Spalte abfragen (z.B. 1 as hat_bild und 0 as hat_bild) und dann nach dieser Zusätzlichen Spalte sortieren. Wie das dann mit einem Limit aussieht weiß ich nicht (ob man das auf beide gemeinsam anwenden kann) aber notfalls kannst du das Limit von beiden abfragen und dann im Skript hinterher nochmal die Anzahl kontrollieren.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
bgx
Mitglied
Beiträge: 228
Registriert: 30.11.2005 22:32
Kontaktdaten:

Beitrag von bgx »

Hmm und wie würde dafür die SQL Anweisung lauten? Union sagt mir garnix. :roll:
Michael Zacher
Mitglied
Beiträge: 1620
Registriert: 03.01.2004 23:12
Wohnort: Aken (Elbe)

Beitrag von Michael Zacher »

UNION

Leider Gottes kenn ich mich mit MySQL nicht so richtig aus, aber ich wollt mal eben meinen Senf dazu abgeben und sagen, wie toll Google doch ist, wenn man nach "UNION + MySQL" sucht. :D
Mit freundlichen Grüßen / Best regards / Met vriendelijke groeten

Michael Zacher
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

UNION ist nicht sonderlich schwierig.

Code: Alles auswählen

$sql = "(SELECT 1 as bild_da,t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time, p2.post_edit_time
   FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
   WHERE t.forum_id = $forum_id
      AND t.topic_poster = u.user_id
      AND p.post_id = t.topic_first_post_id
      AND p2.post_id = t.topic_last_post_id
      AND u2.user_id = p2.poster_id
      AND t.topic_type = " . POST_STICKY . "
AND t.topic_picture <> ''
) UNION (SELECT 0 as bild_da,t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time, p2.post_edit_time
   FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2
   WHERE t.forum_id = $forum_id
      AND t.topic_poster = u.user_id
      AND p.post_id = t.topic_first_post_id
      AND p2.post_id = t.topic_last_post_id
      AND u2.user_id = p2.poster_id
      AND t.topic_type = " . POST_STICKY . "
AND t.topic_picture = '')
   ORDER BY bild_da DESC, topic_picture ASC, topic_title ASC
   LIMIT $start, ".$board_config['topics_per_page'];
Das war jetzt kurz so geschrieben, kann also sein, dass da noch ein paar kleinere Anpassungen nötig sind...
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Soll angeblich funktionieren:

Code: Alles auswählen

select * from * order by spalte1 ASC, spalte2 DESC
Es wird nach Spalte 1 in umgekehrter Reihenfolge sortiert und danach nach Spalte 2 aufsteigend. Probiere es mal aus.

Edit: Ich glaube ich habe das falsch verstanden, dann ist das Problem doch wie hier: http://www.phpbb.de/viewtopic.php?t=138122 (@ gn#36, kannst Du da mal einen Blick drauf werfen, ob ich es richtig gemacht habe?)
Antworten

Zurück zu „Coding & Technik“