2012-10-02 72 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進行更新,並且具有正確的排序和更好的性能。 :-) –