Smilies  Color  Logout  Hilfe     

Tricks, die nicht nur mit MySQL funktionieren

MySQL-Tricks

Tricks, die nicht nur mit MySQL funktionieren

MySQL-Tricks

Seitenbild

Diese Webseite ist eine Community, erfahre mehr darüber!


Sortieren mit zusätzlichen Daten / Bedingtes Sortieren

Das Beispiel-Problem: In einer Tabelle stehen Forenbeiträge oder Kommentare, die ihrerseits wieder Antworten auf diese Beiträge oder Kommentare haben können. Bei der Anzeige der Beiträge bzw. Kommentare sollen diese chronologisch vom neuesten zum ältesten Beitrag sortiert ausgegeben werden. Wurde jedoch auf einen Beitrag geantwortet, soll dieser aufgrund der Aktualität wieder nach oben gerückt werden.

Eine Tabelle (forum) hierzu könnte so aussehen:

ID  Datum            User  Parent-ID  Text
----------------------------------------------------------------
 1  2015-05-01 20:57 Name1 0          Dies ist ein Beispieltext
 2  2015-05-01 21:12 Name2 0          Auch hier steht ein Text
 3  2015-05-02 13:24 Name3 0          Aller guten Dinge sind 3
                             ...
 4  2015-05-02 14:27 Name3 2          Da kann ich auch was zu sagen

Die Themen dieses Forums können mit folgendem SQL-Query abgefragt werden:

SELECT * FROM forum f WHERE Parent_ID = 0 ORDER BY Datum DESC

Ausgabe:

ID  Datum            User  Parent-ID  Text
----------------------------------------------------------------
 3  2015-05-02 13:24 Name3 0          Aller guten Dinge sind 3
 2  2015-05-01 21:12 Name2 0          Auch hier steht ein Text
 1  2015-05-01 20:57 Name1 0          Dies ist ein Beispieltext

Das Ergebnis ist korrekt, aber unbefriedigend. Durch den 4. Eintrag wurde der 2. Eintrag eigentlich aktueller und sollte in der Ausgabe dann auch an erster Stelle stehen. Eine reine Sortierung nutzt hier also nichts mehr.

Das klassische Verfahren würde nun erfordern, dieselbe Tabelle zu joinen und dafür die Bedingung "ON f.ID = f1.Parent_ID" zu verwenden. Hier wird es aber sehr kompliziert, einerseits weil die zu joinende (identische) Tabelle forum f1 ihre Felder an die Feldliste der Tabelle forum f anhängt, andererseits eine Sortierung dann scheitert, wenn eben noch keine Antwort auf einen Beitrag vorhanden ist (Zeilen 1 und 3).

Dafür kann aber sehr effektiv eine Sub-Query zur Anwendung kommen, die sämtliche Nachteile eines richtigen Joins umgeht:

SELECT * FROM forum f WHERE Parent_ID = 0 ORDER BY (SELECT CASE WHEN MAX(Datum) > 0 THEN MAX(Datum) ELSE f.Datum) END FROM forum f1 WHERE f1.Parent_ID = f.ID) DESC

Ausgabe:

ID  Datum            User  Parent-ID  Text
----------------------------------------------------------------
 2  2015-05-01 21:12 Name2 0          Auch hier steht ein Text
 3  2015-05-02 13:24 Name3 0          Aller guten Dinge sind 3
 1  2015-05-01 20:57 Name1 0          Dies ist ein Beispieltext

Es wird also die Tatsache ausgenutzt, daß eine Sub-Query an beliebiger Stelle eingesetzt werden kann, an der ursprünglich exakt ein Tabellenfeld erwartet wird. Daher ist es möglich, statt dem allseits bekannten "ORDER BY Feldname" auch ein beliebiges Konstrukt wie "ORDER BY (Sub-Query oder Bedingungsverschachtelungen)" zu verwenden.

Das könnte Dich auch interessieren:

Der Regenbogenwald - Hilfe zur Selbsthilfe e.V.

25.08.2011: Für den Wahlkampf schweigen die Waffen

Urteil: Mircos Mörder muss lebenslang ins Gefängnis

Forenübersicht

Es wird niemand hasserfüllt geboren



von Micha, 23.05.2015 12:14 Uhr · Teilen · Kommentieren · Gefällt mir · sei der Erste, dem das gefällt!

Kommentare zu diesem Artikel:


Gast′s Profilbild

Eine Community-Webseite wie diese lebt vom aktiven Mitmachen! Wurde noch kein Kommentar verfasst? Eröffne - auch als Gast - eine Diskussion zu diesem Thema, indem Du weiter oben auf 'Kommentieren' klickst und dann den ersten Kommentar schreibst!

Warum gibt es hier kein Kommentar-Plugin von Facebook?

Weil wir den Datenschutz als sehr wichtig ansehen und uns an das BDSG halten! Seiten, die ohne besondere Mechanismen direkt Kommentare über das Facebook-Plugin samt Profilbild etc anzeigen, teilen zwangsweise Facebook mit, wo sich die Facebook-Benutzer ausserhalb von FB gerade aufhalten und diese Informationen werden dort gespeichert, ob man es will oder nicht. Besser auf den Datenschutz achten und auf Facebook-Plugins verzichten als unsere Besucher zu gläsernen Menschen im Netz zu machen!


Freunde Online

Feedback zur Seite
Ich möchte etwas zum Inhalt mitteilen
Ich möchte einen Rechtsverstoß anzeigen
Ich möchte eine mißbräuchliche Nutzung melden
Ich möchte etwas anderes mitteilen


Infos zum Regen­bogenwald

Das neue Design:
Eine wirklich kleine Umfrage

regenbogenwald.de ist die seit Sep­tem­ber 1999 bestehende, nicht kom­mer­ziel­le Com­mu­nity für Jeder­mann!

Neben Informationen, aktuellen News, Er­fahrungs­austausch und Unter­haltung im Chat und Foren, findest Du hier zahl­reiche Gedichte, Geschich­ten, Song­texte, Tage­bücher und vieles mehr.

Die gesamte Webseite ist werbefrei und dennoch kostenlos zu nutzen. Ermöglicht wird das durch den vom Finanzamt Essen als mildtätig aner­kannten Verein Regen­bogen­wald - Hilfe zur Selbst­hilfe e.V.

Du kannst Dich jederzeit kostenlos und ohne jegliche Verpflichtungen regis­trieren und ein­loggen, um das gesamte Angebot dieser Webseite nutzen zu können, indem Du oben auf das Symbol klickst.

Natürlich freuen wir uns über jede Spende für die Projekte des Vereins und zum Unterhalt der Webseite. Die Konto­ver­bin­dung dazu findest Du im Impressum.

Viel Freude beim Stöbern auf diesen Seiten wünscht Dir das Regenbogenwald-Team

Das Layout von regenbogenwald.de hat sich gravierend verändert. Bewerte es bitte nach Schulnoten:

(Ø = 2.5)

Und die Bedienbarkeit / Übersichtlichkeit? Bewerte es bitte nach Schulnoten:

(Ø = 2.6)

Möchtest Du uns dazu noch etwas sagen?

Zurück