MySQL / 6. Сортировка результатов запроса

Сортировка по дню недели

Задача
Вы хотите выполнить сортировку по дню недели.

Решение
Используйте функцию DAYOFWEEK() для преобразования столбца даты в соответствующее числовое значение дня недели.

Обсуждение
Сортировка по дню недели аналогична сортировке по календарному дню, с той лишь разницей, что для вывода упорядоченных значений используется другая функция.

Вы можете получить день недели, применяя DAYNAME(), но тогда на выходе будут строки, упорядоченные в лексическом порядке, а не как дни недели(воскресенье, понедельник, вторник и т. д.). Тут нам пригодится методика вывода одного значения, а упорядочивания по другому. Будем выводить названия дней при помощи функции DAYNAME(), а сортировать их в порядке дней недели будем посредством функции DAYOFWEEK(), которая возвращает числовые значения от 1 до 7 для дней с воскресенья по субботу:

mysql> SELECT DAYNAME(date) AS day, date, description
-> FROM event
-> ORDER BY DAYOFWEEK(date);

+----------+------------+-------------------------------------+
| day | date | description |
+------------+--------------+----------------------------------------+
| Sunday    | 1776-07-14 | Bastille Day                                   |
| Sunday    | 1809-02-12 | Abraham Lincoln's birthday          |
| Monday   | 1215-06-15 | Signing of the Magna Carta          |
| Tuesday   | 1944-06-06 | D-Day at Normandy Beaches       |
| Thursday | 1989-11-09 | Opening of the Berlin Wall            |
| Friday      | 1957-10-04 | Sputnik launch date                      |
| Friday      | 1958-01-31 | Explorer 1 launch date                 |
| Friday      | 1732-02-22 | George Washington's birthday     |
| Saturday | 1789-07-04 | US Independence Day                  |
| Saturday | 1919-06-28 | Signing of the Treaty of Versailles |
+-----------+---------------+----------------------------------------+

Если вы хотите выполнить сортировку по дню недели, но так, чтобы первым днем недели считался понедельник, используйте функцию MOD() для сопоставления понедельнику значения 0, вторнику – 1, ..., воскресенью – 6:

mysql> SELECT DAYNAME(date), date, description
-> FROM event
-> ORDER BY MOD(DAYOFWEEK(date) + 5, 7);

+--------------------+--------------+----------------------------------------+
| DAYNAME(date) | date            | description                                     |
+-------------------+---------------+-----------------------------------------+
| Monday              | 1215-06-15 | Signing of the Magna Carta           |
| Tuesday              | 1944-06-06 | D-Day at Normandy Beaches        |
| Thursday            | 1989-11-09 | Opening of the Berlin Wall             |
| Friday                 | 1957-10-04 | Sputnik launch date                       |
| Friday                 | 1958-01-31 | Explorer 1 launch date                  |
| Friday                 | 1732-02-22 | George Washington's birthday      |
| Saturday            | 1789-07-04 | US Independence Day                   |
| Saturday            | 1919-06-28 | Signing of the Treaty of Versailles  |
| Sunday               | 1776-07-14 | Bastille Day                                    |
| Sunday               | 1809-02-12 | Abraham Lincoln's birthday            |
+--------------------+--------------+-----------------------------------------+

Любой день недели можно сделать первым в упорядоченном списке.

Для сортировки по дню недели можно использовать и функцию WEEKDAY(), помня, что она возвращает другой набор значений (0 для понедельника, …, 6 – для воскресенья).

Статьи по MySQL на эту тему:

Размещение некоторых значений в начале или конце упорядоченного списка
Сортировка IP-адресов в числовом порядке
Сортировка в порядке, определенном пользователем
Сортировка значений ENUM
Сортировка имен хостов по доменам