2014-01-18 50 views
0

我有一個所有用戶的表,並且我有另一個包含該表子集的數組。
例:表中包含1,2,3,4,5,6,7,8,9,10獲得mysql中特定用戶的排名

我的用戶:2,4,6,8,10:

我的用戶排名彼此之間WRT分,無關與1,3,5,7,9

我現在有這個表:

create table uservotes(id int, name varchar(50), vote int); 

INSERT INTO uservotes VALUES 
(1, 'A', 34), 
(2, 'B', 80), 
(3, 'bA', 30), 
(4, 'C', 8), 
(5, 'D', 4), 
(6, 'E', 14), 
(7, 'F', 304), 
(8, 'AA', 42), 
(9, 'Ab', 6), 
(10, 'Aa', 10); 

我如何之中2,4,6,8的排名, 10

回答我要找f或:

id rank votes name 
2  1  80  B 
4  5  8  C 
6  3  14  E 
8  2  42  AA 
10  4  10  Aa 

我真的很感謝任何幫助。感謝您的提前。

回答

1

我懷疑這是你想要什麼:

select uv.*, (@rank := @rank + 1) as rank 
from uservotes uv cross join 
    (select @rank := 0) const 
where uv.id in (2, 4, 6, 8, 10) 
order by votes desc; 

這是MySQL中有效地計算等級,具有where條款一起選擇你的ID的標準方式。

編輯:

開始之前,大多數數據庫,你會簡單地使用row_number()dense_rank()用於這一目的。 MySQL不支持這個ANSI標準功能。

關鍵是變量@rank。子查詢const將其初始化爲0.然後查詢運行。 where子句只獲取您感興趣的行。然後order by通過投票排序,最大的選票在先。最後,@rank := @rank + 1 as rank都更新@rank變量並將其分配給輸出中的一列。

+0

Awesome.Can您解釋一下什麼是紫外線?請。你能簡單地解釋整個查詢嗎?再次感謝。 – jason

0

您需要循環一個SQL問題與動態變量 像

select * from `uservotes` where id = $someones_id 

$ someones_id可能是一個數組爲例