Ich habe eine Ereignistabelle mit starting_date
und ending_date
. Ich möchte die sortieren sie wie folgt:Komplexe Sortierreihenfolge nach Anfangs- und Enddatum auf MySQL
Es gibt 3 Gruppen von Zeilen und sie sollten nacheinander erscheinen, jede Gruppe mit seiner Reihenfolge. Die Gruppen sind wie folgt:
Gruppe 1:
starting_date = curdate() and ending_date = curdate()
. Die Zeilen sollten nachid asc
geordnet werden.Gruppe 2:
starting_date <= curdate() and ending_date > curdate()
. It's Elemente sollten bestellt werden vonending_date asc
Gruppe 3:
starting_date > curdate()
. Es ist Elemente sollten durchstarting date asc
Nimmt man heute may 21
ist bestellt werden, ist dies ein Beispiel für die Ausgabe ich brauche:
| id | starting_date | ending_date |
// Group 1
| 1 | may 21 | may 21 |
| 2 | may 21 | may 21 |
// Group 2
| * | may 20 | may 23 |
| * | may 15 | may 25 |
| * | may 17 | may 26 |
| * | may 21 | may 27 |
// Group 3
| * | may 23 | may 25 |
| * | may 24 | may 25 |
Wie Sie sehen können, jede Gruppe nacheinander angezeigt wird, und jede Zeile Innerhalb einer Gruppe wird durch die angegebenen order by
bestellt.
Bisher habe ich versucht ORDER BY CASE WHEN
Sätze verwenden, aber ich finde mich nicht in der Lage sollte zu verstehen, wenn ich:
- Verwenden Sie mehrere
CASE ... END
Aussagen unter demORDER BY
- Verwenden Sie mehrere
WHEN ... THEN
Anweisungen innerhalb einesORDER BY CASE ... END
- Beide, mehrere
CASE
mit mehrerenwhen
in jedem. - Dies kann nicht mit
ORDER BY
durchgeführt werden.
Dies ist eine der vielen SELECT
Sätze, die ich versucht habe:
select events.id, events.starting_date, events.ending_date from events
where events.ending_date >= CURDATE()
order by
case
when (events.starting_date = curdate() and events.ending_date = (curdate() + interval 23 hour + interval 59 minute)) then
0
when (events.starting_date <= curdate() and events.ending_date > curdate()) then
1
when (events.starting_date > curdate()) then
2
end asc
Diese Abfrage auf die richtige Gruppe setzen Reihen, aber sie sind nicht in ihrer jeweiligen Gruppe bestellt.
Dieser andere setzt die erste Gruppe am Ende.
order by
case when (events.starting_date = curdate() and events.ending_date = (curdate() + interval 23 hour + interval 59 minute)) then events.id end asc,
case when (events.starting_date <= curdate() and events.ending_date > curdate()) then events.ending_date end asc,
case when (events.starting_date > curdate()) then events.starting_date end asc
Was mache ich falsch?
Funktioniert wie ein Charme –