Come posso ordinare il risultato mysql per colonna varchar che contiene il nome del giorno della settimana?Ordina per day_of_week in MySQL
Nota che MONDAY dovrebbe essere il primo, non la DOMENICA.
Come posso ordinare il risultato mysql per colonna varchar che contiene il nome del giorno della settimana?Ordina per day_of_week in MySQL
Nota che MONDAY dovrebbe essere il primo, non la DOMENICA.
O ridisegnare la colonna come suggerito da Williham Totland o eseguire un'analisi delle stringhe per ottenere una rappresentazione della data.
Se la colonna solo contiene il giorno della settimana, allora si potrebbe fare questo:
ORDER BY FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY');
Sto pensando che, a meno di ridisegnare la colonna per usare invece un enum, non c'è molto da fare per questo, oltre a ordinare i risultati dopo averli eliminati.
Modifica: Un attacco informatico è ovviamente quello di aggiungere un'altra tabella con ID: coppie di giorni della settimana e l'utilizzo di join o selezionare in seleziona per simulare un enum.
Triste, ma vero. +1 – Abinadi
Un altro modo sarebbe quello di creare un altro tavolo con quei giorni e un int per ordinare loro da, join che tabella durante la ricerca e ordinare da esso. Ovviamente, l'adesione a un varchar non è raccomandata.
Table DaysOfWeek
id | day
--------------------
1 | Monday
2 | Tuesday
3 | Wednesday
4 | Thursday
5 | Friday
6 | Saturday
SELECT * FROM WhateverTable LEFT JOIN DaysOfWeek su DaysOFWeek.day = WhateverTable.dayColumn ORDER BY DaysOfWeek.id
(Mi scuso se questo non è corretto; Sono stato bloccato con il server SQL di recente)
Ancora, questo NON è raccomandato, ma se non è possibile modificare i dati che hai già ... Funzionerà anche se ci sono valori non standard nel campo giornoColonna.
Questo sembra disordinato, ma ancora funziona e sembra più generico:
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;
usando se è ancora più generico e Messier:
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;
È anche possibile nascondere i dettagli di conversione da nome a int in stored procedure.
... ORDINE BY date_format (order_date, '% w') = 0, date_format (order_date, '% w');
Mi rendo conto che questo è un thread vecchio, ma come si arriva all'inizio di google per determinati tempi di ricerca lo userò per condividere il mio approccio.
Volevo lo stesso risultato della domanda originale, ma in aggiunta volevo che l'ordine dei risultati iniziasse dal giorno corrente della settimana e poi procedesse per il resto dei giorni.
Ho creato una tabella separata, in cui i giorni sono stati elencati in quindici giorni, in modo che, a prescindere dal giorno in cui hai iniziato, potresti eseguire una sequenza di 7 giorni.
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');
Allora ho fatto funzionare la query con una variabile che ha determinato il punto di inizio in sequenza e utilizzato un join per ottenere il numero d'ordine per i giorni.Ad esempio, per avviare la quotazione al Mercoledì, faccio la seguente:
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;
Spero che questo aiuta qualcuno che inciampa su questo post.
Perché non questo?
ORDER BY (
CASE DAYOFWEEK(dateField)
WHEN 1 THEN 7 ELSE DAYOFWEEK(dateField)
END
)
Credo che questo gli ordini Lunedi alla Domenica ...
In aumento perché questo funziona per il mio progetto, ma tenere presente che dovrebbe essere 1 THEN 7. – BClaydon
Se si tenta questo, dovrebbe funzionare:
SELECT ename, TO_CHAR(hiredate, 'fmDay') as "Day"
FROM my_table
ORDER BY MOD(TO_CHAR(hiredate, 'D') + 5, 7)
trovato un altro modo che funziona per me:
SELECT LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'fmDAY') as 'Day' FROM EMPLOYEES
ORDER BY TO_CHAR(HIRE_DATE, 'd');
Spero che sia utile
Lunedì prima. ;) –
Come potete vedere, ho prestato molta attenzione all'ordine stesso :( –
Può essere evidente per la maggior parte, ma non digitare <> quando si digita il nome del campo. –