MySQL ORDER BY

Microhome

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine einfache MySQL Tabelle mit u.a. den Spalten "rank" und "cover".

Nun gibt es einige Items, deren Rank 0 ist und / oder deren cover leer ist. Ich möchte zuerst die ausgegeben bekommen, auf die beides zutrifft und anschließend die, deren rank zwar > 0 ist, aber die ein cover haben und zum Schluss diejenigen, deren rank 0 ist.

Ich benutze für den ersten Teil (Artikel deren Rank != 0 ist) folgende MySQL Abfrage:

Code:
SELECT * FROM data WHERE rank != 0 ORDER BY rank ASC, cover DESC

Allerdings ist die Ausgabe nicht so sortiert, wie ich sie mir vorstelle, denn es wird zwar nach Rank aufsteigend sortiert, aber der zweite Fall (cover) würde ja erst dann als Kriterium ins Gewicht fallen, wenn der Rank gleich wäre.

Heißt das ich müsste 3 Abfragen machen? Einmal für rank != 0 + cover != '', dann für rank != '' + cover = '' und dann nochmal für rank = 0?!




Vielen Dank und sonnige Grüße!
 
SQL:
SELECT * FROM rankcover ORDER BY (rank!=0)+(cover!='')*2 DESC, rank ASC, cover DESC

Es gibt bestimmt bessere Lösungen und ich kann dir auch nicht sagen, wie es mit der Performance aussieht (Ein schneller Test mit 500.000 Datensätzen dauert etwa 800ms pro Abfrage. Aber ich weiß nicht ob es etwas ausmacht, dass ich viele doppelte Datensätze drin hab).
Eventuell solltest du eine weitere Spalte zum Sortieren anlegen.

Edit: ich bastele gerade etwas mit UNION zusammen, das müsste schneller sein
Edit2: scheinbar kann man bei UNION nicht alle Teile getrennt sortieren. Wenn sonst niemand eine bessere Idee hat, musst du die Abfragen eben nacheinander machen. Das wird am schnellsten sein.
 
Zuletzt bearbeitet:
Danke für deine Antwort. Ich habe ja noch ein LIMIT von 10 / page drin, das heißt die Geschwindigkeit ist in diesem Fall mal nicht entscheidend, sodass ich auf deine Methode zurückgreifen kann, vielen Dank dafür! Ich habe nur noch nicht so ganz verstanden, was diese Abfrage bedeutet?! Wärst du do lieb und würdest es nochmal in normaler Sprache versuchen zu formulieren?

Ich will einfach nicht etwas benutzen, was ich selbst nicht nachvollziehen kann.




Danke dir und eine gute Nacht erstmal!!
 
Danke für deine Antwort. Ich habe ja noch ein LIMIT von 10 / page drin, das heißt die Geschwindigkeit ist in diesem Fall mal nicht entscheidend

Das LIMIT hilft dir nicht weiter, weil sortiert werden müssen trotzdem alle Datensätze.

Ich erklär mal kurz mein Query
SQL:
ORDER BY (rank!=0)+(cover!='')*2

Um das zu verstehen, musst du wissen, dass MySql implizit zwischen boolean und anderen Datentypen konvertiert. Der Ausdruck "rank!=0" ist ja entweder wahr oder falsch. Da der Ausdruck aber im Kontext einer Berechnung steht, wird wahr zu 1 und falsch zu 0. Das gleiche bei "cover!=''".
-Wenn du also einen Datensatz hast, der sowohl rank als auch cover hat, steht dort "1+1*2" also 3
-Ein Datensatz ohne rank hat "0+1*2" also 2
-Ein Datensatz ohne cover hat "1+0*2" also 1
-Und ein Datensatz ohne beides hat "0+0*2" also 0

Und die vier Werte (0,1,2,3) werden zum sortieren genutzt.
 
Hallo CPoly,

vielen Dank für diese super Erklärung. Das ist ja mal echt clever und da ich es nun auch verstanden habe, kann ich es sogar verwenden :)




Beste Grüße und schonmal langsam einen guten Start ins Wochenende.
 
Zurück