sql: Сортировка по дате
Доброго времени суток. Подскажите пожалуйста как мне отсортировать все записи по дате, но не только по возрастанию, но и начиная от сегодня, например: 6 декабря (ближайшая дата) 12 декабря 3 января 6 июня 1 декабря Другой пример: Например сегодня 6 июня 6 июня 1 декабря 6 декабря 12 декабря 3 января Часть решения у меня уже есть:
SELECT * FROM db ORDER BY DATE_FORMAT(begin, '%m%d')
используя where не вариант, т.к надо выводить все записи.
Отслеживать
задан 6 дек 2015 в 12:46
91 1 1 золотой знак 1 1 серебряный знак 8 8 бронзовых знаков
Почему 1 декабря в примере стоит на последнем месте?
– user177221
6 дек 2015 в 12:49
Потому что по сути у нас есть записи за весь год от 1го января и до 31 декабря. и нам нужно их отсортировать так, что бы выводились все даты которые ближе к сегодняшней и шли по порядку) т.е получается этакий круг.
6 дек 2015 в 12:54
И что должно быть в сортировке с записями, которые ДО текущей даты ? Как нибудь пример поправьте, например текущую дату возьмите за июль и несколько дат ДО и ПОСЛЕ текущей
6 дек 2015 в 12:56
И мне, как пользователю, например, совершенно непонятно будет почему я должен искать довольно близкую дату 1 декабря где то в конце списка. Я бы еще понял если бы это было 1 декабря следующего года, но года тут нет
6 дек 2015 в 12:58
Указал доп. пример. Это надо для вывода ближайших события, но по порядку. Пользователю будет не очень интересно смотреть какие события были до сегодня, а если и будет интересно, то он воспользуется фильтром, но фильтр это уже совсем другая тема 🙂
6 дек 2015 в 13:02
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
select B.* from ( select db.*, DATE_FORMAT(begin, '%m%d') - DATE_FORMAT(now(), '%m%d') as DIFF from db ) B ORDER BY (CASE WHEN diff
В принципе можно без подзапроса, но мне не нравится выписывать длиннющие строки с date_format . Но основная идея: получаем число, "расстояние" от текущей даты до тестируемой и если оно меньше 0 (Дата до текущей) то увеличиваем "расстояние" так, что бы оно оказалось после всех дат, которые после
Форум пользователей MySQL
к сожалению, это не помогло. Сортировка теперь такая - публикуются вначале старые, потом новые датированные тексты. Нужно же наоборот. Что интересно - поставил asc вместо desc - ничего не поменялось. К тому же теперь, вообще не видно даты. только точка вместо даты.
#4 17.01.2010 23:11:20
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5818
Re: сортировка по дате
SELECT DATE_FORMAT ( ` date `, '%d.%m.%Y' ) AS d from tinisto ORDER BY ` date ` desc
#5 18.01.2010 01:29:49
LazY _cмельчак Зарегистрирован: 02.04.2007 Сообщений: 845
Re: сортировка по дате
Плохо давать колонкам SELECT'ов псевдонимы, совпадающие с именами колонок таблицы, если потом надо сортировать или группировать по ним - получается путаница.
#6 18.01.2010 07:55:37
tinisto Участник Зарегистрирован: 17.01.2010 Сообщений: 5
Re: сортировка по дате
Сортировка работает верно в этом случае, но дата не отображается (только точка).
#7 18.01.2010 08:47:37
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5818
Re: сортировка по дате
test >SELECT DATE_FORMAT ( ` date `, '%d.%m.%Y' ) AS d from a ORDER BY ` date ` DESC ;
+ ------------+
| d |
+ ------------+
| 17.01 .2010 |
| 16.01 .2010 |
| 17.12 .2009 |
| 17.01 .2009 |
+ ------------+
4 rows in set ( 0.02 sec )
Вы хотите сказать, что при замене в запросе только псевдонима у вас изменяется отображение даты (в одном случае правильно, в другом точка)? Если так, то приведите оба запроса с результатом выборки.
#8 18.01.2010 08:58:50
tinisto Участник Зарегистрирован: 17.01.2010 Сообщений: 5
Re: сортировка по дате
SELECT DATE_FORMAT( 'date', '%d.%m.%Y' ) AS d
FROM a
ORDER BY 'date' DESC
LIMIT 0 , 30
Ошибка видна. Как это теперь исправить?
Поле date - тип date, Ноль - стоит null. Ставлю not null. Все равно null возвращается.
#9 18.01.2010 09:00:44
vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5818
Re: сортировка по дате
'date' - это строка
`date` - это колонка. Имя колонки взято в обратные кавычки, так как date является ключевым словом. Вообще это плохая практика давать колонкам или таблицам имена, являющиеся ключевыми словами.
В вашем случае попытка вычислить время от строковой константы приводит к закономерному результату.
#10 18.01.2010 11:29:21
tinisto Участник Зарегистрирован: 17.01.2010 Сообщений: 5
Re: сортировка по дате
Vasya, благодарю Вас! Все получилось.
Страниц: 1
- Список
- » Раздел для начинающих
- » сортировка по дате
Сортировка данных в SQL (ORDER BY)
При выборке данных бывает важно получить их в определенном упорядоченном виде. Сортировка может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она так же является сортировкой по возрастанию или убыванию. Она так же может быть выполнена в любых направлениях – от А, до Я, и наоборот от Я, до А.
Суть процесса сортировки заключается к приведению последовательности к определенному порядку. Подробней о сортировки можно узнать в статье "Алгоритмы сортировки". Например, сортировка произвольной числовой последовательности по возрастанию:
должна привести к упорядоченной последовательности:
Аналогично, при сортировке по возрастанию строковых значений:
Иванов Иван, Петров Петр, Иванов Андрей
результат должен быть:
Иванов Андрей, Иванов Иван, Петров Петр
Здесь строка "Иванов Андрей" перешла в начало, так как сравнение строк производится посимвольно. Обе строки начинаются одинаковых символов "Иванов ". Так как символ "А" в слове "Андрей" идет раньше в алфавите, чем символ "И" в слове "Иван", то эта строка будет поставлена раньше.
Сортировка в запросе SQL
Для выполнения сортировки в строку запроса нужно добавить команду ORDER BY. После этой команды указывается поле, по которому производится сортировка.
Для примеров используем таблицу товаров goods:
| num (номер товара) |
title (название) |
price (цена) |
| 1 | Мандарин | 50 |
| 2 | Арбуз | 120 |
| 3 | Ананас | 80 |
| 4 | Банан | 40 |
Данные здесь уже упорядочены по столбцу "num". Теперь, построим запрос, который выведет таблицу с товарами, упорядоченными в алфавитном порядке:
SELECT * FROM goods ORDER BY title
SELECT * FROM goods – указывает выбрать все поля из таблицы goods;
ORDER BY – команда сортировки;
title – столбец, по которому будет выполняться сортировка.
Результат выполнения такого запроса следующий:
| num | title | price |
| 3 | Ананас | 80 |
| 2 | Арбуз | 120 |
| 4 | Банан | 40 |
| 1 | Мандарин | 50 |
Так же можно выполнить сортировку для любого из полей таблицы.
Направление сортировки
По умолчанию, команда ORDER BY выполняет сортировку по возрастанию. Чтобы управлять направлением сортировки вручную, после имени столбца указывается ключевое слово ASC (по возрастанию) или DESC (по убыванию). Таким образом, чтобы вывести нашу таблицу в порядке убывания цен, нужно задать запрос так:
SELECT * FROM goods ORDER BY price DESC
Сортировка по возрастанию цены будет:
SELECT * FROM goods ORDER BY price ASC
Сортировка по нескольким полям
SQL допускает сортировку сразу по нескольким полям. Для этого после команды ORDER BY необходимые поля указываются через запятую. Порядок в результате запроса будет настраиваться в той же очередности, в которой указаны поля сортировки.
| column1 | column2 | column3 |
| 3 | 1 | c |
| 1 | 3 | c |
| 2 | 2 | b |
| 2 | 1 | b |
| 1 | 2 | a |
| 1 | 3 | a |
| 3 | 4 | a |
Отсортируем таблицу по следующим правилам:
SELECT * FROM mytable ORDER BY column1 ASC, column2 DESC, column3 ASC
Т.е. первый столбец по возрастанию, второй по убыванию, третий опять по возрастанию. Запрос упорядочит строки по первому столбцу, затем, не разрушая первого правила, по второму столбцу. Затем, так же, не нарушая имеющихся правил, по третьему. В результате получится такой набор данных:
| column1 | column2 | column3 |
| 1 | 3 | a |
| 1 | 3 | c |
| 1 | 2 | a |
| 2 | 2 | b |
| 2 | 1 | b |
| 3 | 1 | a |
| 3 | 1 | c |
Порядок команды ORDER BY в запросе
Сортировка строк чаще всего проводится вместе с условием на выборку данных. Команда ORDER BY ставится после условия выборки WHERE. Например, выбираем товары с ценой меньше 100 рублей, упорядочив по названию в алфавитном порядке:
SELECT * FROM goods WHERE price < 100 ORDER BY title ASC
Сортировка данных — Основы SQL
Обычно у выборки данных из базы нет определенного порядка. Точнее, порядок есть, но он логически не обоснован. По умолчанию база возвращает данные в том порядке, в котором ей удобнее. Иногда этот порядок может совпасть с желаемым, но рассчитывать на это нельзя.
Теоретически порядок может поменяться при следующем запросе, или когда количество данных в таблице изменится. Обновление версии базы данных тоже может повлиять на это.
В этом уроке мы разберем, как сортировать данные в базе в том порядке, который нам нужен. Для этого используется запрос ORDER BY .
Как устроен запрос на сортировку
Допустим, нам нужно отсортировать данные в базе:
Сортировка задается с помощью оператора ORDER BY . За ней следует имя поля, по которому происходит сортировка:
SELECT * FROM users ORDER BY username;
Такой запрос вернет всю информацию о пользователях, отсортированную по username . Если порядок не указан, то сортировка происходит по возрастанию ASC .
Сортировка подразумевает сравнение значений между собой. По какому принципу база данных сортирует строки username , как в примере выше? Самый распространенный способ — лексикографический порядок, то есть по алфавиту.
База данных знает, как сравнивать не только числа, но и строки, и даты. Сортировка по датам — крайне частая операция, выглядит она идентично любой другой сортировке:
SELECT * FROM users ORDER BY created_at;
Здесь мы отсортировали пользователей по дате создания в прямом порядке, то есть по возрастанию.
Как управлять порядком сортировки
Сортировать данные можно разными способами:
- В прямом порядке
- В обратном порядке
- По нескольким полям
Прямой порядок сортировки
Если ничего дополнительно не указывать, то ORDER BY сортирует в прямом порядке — от меньшего к большему. Запрос выше — это сокращенная версия полного запроса с сортировкой.
Полный запрос включает в себя ASC , который подставляется автоматически, если ничего не указано:
SELECT * FROM users ORDER BY created_at ASC; -- То же самое, что и SELECT * FROM users ORDER BY created_at;
Обратный порядок сортировки
Чтобы выполнить сортировку в обратном порядке, указываем DESC :
SELECT * FROM users ORDER BY created_at DESC;
Сортировка по нескольким полям
Иногда нужно отсортировать данные сразу по нескольким полям. Этого можно достичь, если перечислить поля через запятую:
SELECT * FROM users ORDER BY first_name, created_at;
Порядок сортировки в таком случае задается для каждого поля в отдельности:
SELECT first_name, created_at FROM users ORDER BY first_name ASC, created_at DESC;
