Seite 1 von 2
[Erledigt] SQL Abfrage sortieren
Verfasst: 17.12.2006 17:40
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 <>'' ?
Verfasst: 17.12.2006 18:22
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.
Verfasst: 17.12.2006 18:31
von bgx
Klar kann ich die ausschliessen

, 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!
Verfasst: 17.12.2006 18:35
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!
Verfasst: 17.12.2006 19:43
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???
Verfasst: 18.12.2006 00:29
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.
Verfasst: 18.12.2006 08:08
von bgx
Hmm und wie würde dafür die SQL Anweisung lauten? Union sagt mir garnix.

Verfasst: 18.12.2006 08:10
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.

Verfasst: 18.12.2006 09:47
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...
Verfasst: 18.12.2006 10:06
von Xwitz
Soll angeblich funktionieren:
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?)