2

让我们假设一个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

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

最年轻、最受欢迎的人应该永远在最前面。最古老和最不受欢迎的应该总是在底部。

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

4

1 回答 1

6
select *, priority*0.6+age*0.4 as sortkey from ... order by sortkey.
于 2012-10-02T08:52:02.680 回答