Предположим, что таблица users
выглядит так:
age | popularity
------------------
16 | 2
23 | 5
17 | 2
16 | 3
... | ...
... | ...
Я хочу выбрать строки с меньшим возрастом и большей популярностью. Но не выбирать одно из другого.
С участием:
SELECT *
FROM `users`
ORDER BY `age` ASC, `popularity` DESC
У нас будут молодые пользователи наверху, а пользователи с одинаковым age
будут упорядочены по популярности среди них самих.
И с:
SELECT *
FROM `users`
ORDER BY `popularity` DESC, `age` ASC
У нас будут самые популярные пользователи сверху, а пользователи с одинаковым popularity
упорядочены по age
между собой.
Но я не хочу выбирать одну сортировку над другой. Я хочу их смешать.
Как добиться сортировки 60 % на основе popularity
и 40 % на основе age
?
Есть ли универсальное решение для такой сортировки? Является ли пользовательская функция единственным вариантом?
ОБНОВЛЕНИЕ: примеры желаемых результатов
age | popularity
------------------
16 | 8
15 | 2
23 | 5
29 | 10
16 | 3
16 | 2
17 | 2
Так что если пользователь очень молодой, она должна быть выше даже при меньшей популярности. Если пользователь довольно популярен, он должен быть выше, даже если он старше.
Самые молодые и самые популярные всегда должны быть на высоте. Самые старые и наименее популярные всегда должны быть внизу.
Я ищу универсальное решение не только для чисел, но и для дат, строк и т. д.