Wie kann ich das mysql-Ergebnis von varchar Spalte, die Tag der Woche Name enthält bestellen?Sortieren nach day_of_week in MySQL
Beachten Sie, dass MONTAG zuerst gehen sollte, nicht SONNTAG.
Wie kann ich das mysql-Ergebnis von varchar Spalte, die Tag der Woche Name enthält bestellen?Sortieren nach day_of_week in MySQL
Beachten Sie, dass MONTAG zuerst gehen sollte, nicht SONNTAG.
Entweder Redesign der Spalte wie von Williham Totland vorgeschlagen, oder einige String-Parsing, um eine Datumsdarstellung zu erhalten.
Wenn die Spalte nur den Wochentag enthält, dann können Sie dies tun:
ORDER BY FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY');
Ich denke, dass kurz vor der Neugestaltung der Spalte, um ein Enum stattdessen verwenden, gibt es nicht viel zu tun, abgesehen von der Sortierung der Ergebnisse, nachdem Sie sie erhalten haben.
Edit: Ein Dirty Hack ist natürlich eine andere Tabelle mit ID hinzuzufügen: wochentag Paare und mit Joins oder wählen Sie in wählt eine gefälschte enum.
Traurig, aber wahr. +1 – Abinadi
Eine andere Art und Weise mit jenen Tagen eine andere Tabelle zu erstellen wäre und ein int ihnen durch, um zu bestellen, an, dass Tabelle bei der Suche und Reihenfolge von ihm. Natürlich wird das Hinzufügen zu einem Varchar nicht empfohlen.
Table DaysOfWeek
id | day
--------------------
1 | Monday
2 | Tuesday
3 | Wednesday
4 | Thursday
5 | Friday
6 | Saturday
SELECT * FROM WhateverTable LEFT JOIN DaysOfWeek auf DaysOFWeek.day = WhateverTable.dayColumn ORDER BY DaysOfWeek.id
(Entschuldigt, wenn das nicht richtig ist, ich habe vor kurzem mit SQL Server aufgeklebt)
Noch einmal, dies wird NICHT empfohlen, aber wenn Sie die Daten, die Sie bereits haben, nicht ändern können ... Dies funktioniert auch, wenn nicht-Standard-Werte im Feld DayColumn sind.
Das sieht chaotisch, aber immer noch funktioniert und scheint mehr generic:
select day,
case day
when 'monday' then 1
when 'tuesday' then 2
when 'wednesday' then 3
when 'thursday' then 4
when 'friday' then 5
when 'saturday' then 6
when 'sunday' then 7
end as day_nr from test order by day_nr;
verwenden, wenn noch mehr Generika und Messier ist:
select id, day,
if(day = 'monday',1,
if(day = 'tuesday',2,
if(day = 'wednesday',3,
if(day = 'thursday',4,
if(day = 'friday',5,
if(day = 'saturday',6,7)
)
)
)
)
) as day_nr from test order by day_nr;
Sie können auch ausblenden, um die Details der Umwandlung von Namen in int in der gespeicherten Prozedur.
... ORDER BY Datum_Format (order_date, '% w') = 0, Datum_Format (order_date, '% w');
Ich realisiere, dass dies ein alter Thread ist, aber da es an die Spitze von Google für bestimmte Suchzeiten kommt, werde ich es verwenden, um meinen Ansatz zu teilen.
Ich wollte das gleiche Ergebnis wie die ursprüngliche Frage, aber zusätzlich wollte ich die Reihenfolge der Ergebnisse ab dem aktuellen Tag der Woche und dann durch den Rest der Tage.
Ich erstellte eine separate Tabelle, in der die Tage über zwei Wochen aufgelistet wurden, so dass egal, an welchem Tag Sie begannen, Sie eine Folge von 7 Tagen durchlaufen konnten.
CREATE TABLE IF NOT EXISTS `Weekdays` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;
INSERT INTO `Weekdays` (`id`, `name`) VALUES
(1, 'Monday'),
(2, 'Tuesday'),
(3, 'Wednesday'),
(4, 'Thursday'),
(5, 'Friday'),
(6, 'Saturday'),
(7, 'Sunday'),
(8, 'Monday'),
(9, 'Tuesday'),
(10, 'Wednesday'),
(11, 'Thursday'),
(12, 'Friday'),
(13, 'Saturday'),
(14, 'Sunday');
Ich lief dann die Abfrage mit einer Variablen, die den Startpunkt in der Reihenfolge bestimmt und verwendet eine der Bestellnummer für die nächsten Tage zu bekommen beizutreten.Zum Beispiel die Auflistung am Mittwoch zu beginnen, ich folgendes:
SELECT @startnum := MIN(id) FROM Weekdays WHERE name='Wednesday';
SELECT * FROM Events INNER JOIN (SELECT id as weekdaynum, name as dayname FROM Weekdays WHERE id>(@startnum-1) AND id<(@startnum+7)) AS s2 ON s2.dayname=Events.day ORDER BY weekdaynum;
Ich hoffe, das jemand, der auf diesen Beitrag stolpert hilft.
Warum nicht das?
ORDER BY (
CASE DAYOFWEEK(dateField)
WHEN 1 THEN 7 ELSE DAYOFWEEK(dateField)
END
)
Ich glaube, diese Aufträge Montag bis Sonntag ...
Upvoted, weil dies für mein Projekt funktioniert, aber denken Sie daran, dies sollte 1 sein THEN 7. – BClaydon
Wenn Sie dies versuchen, sollte es funktionieren:
SELECT ename, TO_CHAR(hiredate, 'fmDay') as "Day"
FROM my_table
ORDER BY MOD(TO_CHAR(hiredate, 'D') + 5, 7)
einen anderen Weg gefunden, die für mich funktioniert:
SELECT LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'fmDAY') as 'Day' FROM EMPLOYEES
ORDER BY TO_CHAR(HIRE_DATE, 'd');
Hoffe es hilft
Montag zuerst. ;) –
Wie Sie sehen können, habe ich sehr genau auf die Bestellung selbst geachtet :( –
Kann für die meisten offensichtlich sein, aber tippen Sie nicht <> bei der Eingabe des Feldnamens. –