让我们假设一个 users
表如下:
age | popularity
------------------
16 | 2
23 | 5
17 | 2
16 | 3
... | ...
... | ...
我想选择年龄较小且流行度较高的行。但不要选择其中之一。
与:
SELECT *
FROM `users`
ORDER BY `age` ASC, `popularity` DESC
我们会将年轻的用户排在最前面,而具有相同年龄
的用户将按彼此之间的受欢迎程度排序。
还有:
SELECT *
FROM `users`
ORDER BY `popularity` DESC, `age` ASC
我们会将最受欢迎的用户排在最前面,并将具有相同popularity
的用户按age
排序。
但我不想选择一个排序而不是另一个。我想把它们混在一起。
如何实现基于 popularity
的 60% 和基于 age
的 40% 的排序?
是否有针对此类排序的通用解决方案?自定义函数是唯一的选择吗?
更新:示例所需结果
age | popularity
------------------
16 | 8
15 | 2
23 | 5
29 | 10
16 | 3
16 | 2
17 | 2
因此,如果一个用户非常年轻,她应该更高,即使知名度较低。如果一个用户很受欢迎,即使她年纪大了,她也应该更高。
最年轻和最受欢迎的应该永远在最前面。最旧和最不受欢迎的应该始终在底部。
我正在寻找一种通用解决方案,不仅适用于数字,还适用于日期、字符串等。
最佳答案
select *, priority*0.6+age*0.4 as sortkey from ... order by sortkey.
关于mysql - 如何按每列不同优先级的多列排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12687150/