LINUX.ORG.RU

MySQL и нетривиальная сортировка

 , , , ,


0

2

Всем привет!

Только начал изучать SQL. Столкнулся с нетривиальной задачей.

Есть таблица 'user' в которой есть стобец birthday (день рождения пользователя). Требуется получить выборку всех пользователей, отсортированную по столбцу birthday таким образом, чтобы выше находились те, у которых день рождения ближе всего к текущей дате.

Вопрос номер один. Это вообще возможно сделать посредством самой базы, не прибегая к средствая ЯП?

Если ответ утвердительный, тогда вот второй вопрос: как это сделать? Подскажите запрос, пожалуйста. Сам пока пришел вот к такому решению (взятие разницы):

SELECT id,name,birthday, DATEDIFF(`birthday`, CURDATE()) AS diff  FROM `user` order by CASE WHEN diff < 0 THEN 1 ELSE 0 END, diff;

Не это работает не так как надо.

Заранее спасибо.


А может тебе надо найти всех пользователей у которых скоро день рождения? Или недавние именинники всё-таки тоже нужны, при-чём в той-же куче?

MrClon ★★★★★ ()

Можт так?

select * from human ORDER BY (curdate() - birthday);
unt1tled ★★★★ ()
Ответ на: комментарий от MrClon

Нет. Мне нужно выбрать ВСЕХ, но упорядочит выборку по приближению дней рождения к текущей дате.

Например, из записей вида (прощенный вид):

id   name   birthday
1    user1  1987-02-12
2    user2  1986-02-05
3    user3  1961-04-12
4    user4  1990-03-25
...


на выходе должно получиться так (сегодня 2017-02-17):
id   name   birthday
2    user2  1986-02-05
1    user1  1987-02-12
4    user4  1990-03-25
3    user3  1961-04-12
...
djnoob ()
Последнее исправление: djnoob (всего исправлений: 1)
Ответ на: комментарий от djnoob
SELECT `id`, `name`, `birthday`
FROM `user`
WHERE DAYOFYEAR(`birthday`) > DAYOFYEAR(CURDATE())
ORDER BY (ABS(DAYOFYEAR(CURDATE()) - DAYOFYEAR(`birthday`)));
NeOlip ★★ ()
Последнее исправление: NeOlip (всего исправлений: 1)
Ответ на: комментарий от alex4321

Вроде нужно узнать у кого ближайший день рождения, а этот вариант вернёт список пользователей, отсортированный по возрасту.

NeOlip ★★ ()
Ответ на: комментарий от alex4321

DATEDIFF считает не совсем то, что нужно ТС.

SELECT ABS(DATEDIFF('2016-01-16','2017-01-17'));
Вернет 367, а нужно 1.

NeOlip ★★ ()

Не это работает не так как надо.
SELECT id,name,birthday,
DATEDIFF(`birthday`, CURDATE()) AS diff FROM `user`
order by CASE WHEN diff < 0 THEN 1 ELSE 0 END, ABS(diff) ASC;
diff ABS(diff) ASC

tested on mariadb-10.1/mysql-5.5.

P.S.: Ну и не стоит напоминать, что это будет работать только для дат, без учета времени.

znenyegvkby ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.