如何按每列不同优先级的多列排序?

时间:2012-10-02 08:48:19

标签: mysql database sql-order-by database-performance

我们假设一个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的用户。

但我不想选择另一种排序。我想混淆它们。

如何根据popularity和基于age的40%进行排序?

这种分类是否有通用的解决方案?自定义功能是唯一的选择吗?

更新:示例所需结果

 age  | popularity
------------------
  16  |     8
  15  |     2
  23  |     5
  29  |    10
  16  |     3
  16  |     2
  17  |     2

因此,如果用户非常年轻,即使人气较少,她也应该更高。如果用户非常受欢迎,即使她年纪较大,她也应该更高。

最年轻,最受欢迎的应该始终排在最前面。最老和最不受欢迎的应该始终在最底层。

我正在寻找一种通用的解决方案,不仅仅是数字,还包括日期,字符串等。

1 个答案:

答案 0 :(得分:5)

select *, priority*0.6+age*0.4 as sortkey from ... order by sortkey.