2012-10-02 68 views
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 

我们将在上面最流行的用户和用户与age它们之间的有序相同popularity

但我不想选择一个排序。我想混合起来。

如何根据popularity和40%基于age实现60%的分类?

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

UPDATE:样品期望的结果

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

因此,如果用户是非常年轻的,她应该会更高,甚至更小的人气。如果用户很流行,即使年龄较大,她也应该更高。

最年轻和最受欢迎的应该总是在最上面。最古老和最不受欢迎的应该总是在最底层。

我在寻找一个通用的解决方案,不仅仅是数字,而是日期,字符串等等。

+1

你能显示样本结果吗? –

+0

@JohnWoo示例结果添加并解释了一下。 –

回答

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

这将能够使用查询的索引? –

+1

不,如果你想使用索引,你必须添加一个新字段来存储这个值。 – Bohdan

+0

@Bohdan实际上存储在一个单独的领域这样的价值是很有道理的。我将能够使用后台进程或cronjob进行更新,并且具有正确的排序和更好的性能。 :-) –