Сортировка в SQL по новизне и по рейтингу
База данных Postgres 17. Есть таблица:
id | title | rating | created_at |
---|---|---|---|
1 | Name1 | 10 | 2025-02-01 |
2 | Name2 | 30 | 2025-02-02 |
3 | Name3 | 20 | 2025-02-03 |
4 | Name4 | 0 | 2025-02-20 |
Как составить SQL запрос чтобы ORDER BY был в зависимости от даты создания. Если разница даты от текущей меньше 10 дней, то чтобы сортировалось по дате, иначе сортировалось бы по рейтингу. Что-то типа такого:
CASE WHEN created_at >= '2025-02-14' THEN created_at ELSE rating END DESC
Результат должен быть:
- Name4
- Name2
- Name3
- Name1
Ну или как это можно сделать средствами Laravel
Ответы (2 шт):
Если разница даты от текущей меньше 10 дней, то чтобы сортировалось по дате, иначе сортировалось бы по рейтингу.
ORDER BY
-- первый шаг - сперва отделяем новые от старых
CASE WHEN created_at >= '2025-02-14' THEN 0 ELSE 1 END ASC,
-- второй шаг - сортируем новые по дате, сперва самые новые
CASE WHEN created_at >= '2025-02-14' THEN created_at END DESC,
-- третий шаг - сортируем по рейтингу, сначала наибольший рейтинг
rating DESC
Ну и чисто поржать:
ORDER BY CASE WHEN created_at >= '2025-02-14'
THEN created_at - '2025-02-28' + 100
ELSE rating
END
Где '2025-02-28'
- дата заведомо не меньше любой даты в таблице, а 100
- число заведомо больше, чем интервал между выбранной выше датой и самой древней датой в таблице в днях. Ну и предполагается, что рейтинг не может быть отрицательным.
SELECT * FROM your_table
ORDER BY
CASE
WHEN CURRENT_DATE - created_at < INTERVAL '10 days' THEN created_at
ELSE rating
END DESC;