Как упорядочить по нескольким столбцам с разным приоритетом для каждого столбца?

Предположим, что таблица 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

Так что если пользователь очень молодой, она должна быть выше даже при меньшей популярности. Если пользователь довольно популярен, он должен быть выше, даже если он старше.

Самые молодые и самые популярные всегда должны быть на высоте. Самые старые и наименее популярные всегда должны быть внизу.

Я ищу универсальное решение не только для чисел, но и для дат, строк и т. д.


person Haralan Dobrev    schedule 02.10.2012    source источник
comment
Результаты примера @JohnWoo добавлены и немного объяснены.   -  person Haralan Dobrev    schedule 02.10.2012


Ответы (1)


person    schedule
comment
Сможет ли это использовать индекс для запроса? - person Haralan Dobrev; 02.10.2012
comment
Нет, если вы хотите использовать индекс, вам нужно добавить новое поле для хранения этого значения. - person Bohdan; 02.10.2012
comment
@Bohdan действительно имеет смысл хранить такое значение в отдельном поле. Я мог бы обновляться с помощью фонового процесса или cronjob и иметь правильную сортировку и лучшую производительность. :-) - person Haralan Dobrev; 02.10.2012
comment
@HaralanDobrev Это денормализует базу данных. Если вы хотите сделать это таким образом, определите представление. - person user207421; 02.10.2012