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

标签 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

我们会将年轻的用户排在最前面,而具有相同年龄的用户将按彼此之间的受欢迎程度排序。

还有:

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/

相关文章:

mysql - 处理 NULL 值的智能查询

Mysql 根据条件分组求和

java - H2:打开连接、更新、关闭连接,现在我的所有更改都消失了吗?

php - 数据访问层,最佳实践

objective-c - 什么用于核心数据排序?

mysql - 按受欢迎程度排序 MYSQL

php - 如何更改JSON输出格式以及如何支持汉字?

mysql - 导轨 : Mysql query returning null

php - MySQL 查询到 CSV 格式

mysql - MariaDB 上的 "GROUP BY"与 MySQL 的行为不同