2011-09-12 36 views
2

所以我有兩個表,「參與」和「票」。 表中的每一行「投票」都包含一個「參與_id」來引用參與投票的參與者。從兩張表Mysql排名

現在,我希望能夠選擇絕對排名參與基於其擁有的票數。

通常情況下,這將只是用這個簡單的查詢很簡單:

SELECT p.id, COUNT(v.id) as votes 
FROM participations as p 
JOIN votes as v on p.id = v.participation_id 
GROUP BY v.participation_id 
ORDER BY votes DESC; 

,但我必須要能夠在那裏的地方添加一些WHERE子句。所以如果我這樣做,我會得到一個相對排名(即它的排名相對於過濾行集)

有沒有人知道這是可能的只有一個查詢!? (允許使用子查詢)我希望這個問題對任何人都有意義。

+0

是的,只是在GROUP – ajreal

回答

4

你需要使用一個變量,它增加的每一行,並從查詢結果中選擇,如:

SET @rank := 0; 
SELECT id, votes, rank 
from (
    SELECT id, votes, (@rank := @rank + 1) as rank 
    from (
    SELECT p.id, COUNT(v.id) as votes 
    FROM participations as p 
    JOIN votes as v on p.id = v.participation_id 
    WHERE ... -- add your where clause, if any, here to eliminate completely from results 
    GROUP BY v.participation_id 
    ORDER BY votes DESC 
) x 
) y 
-- Now join to apply filtering to ranked results, for example: 
JOIN participations p1 on p1.id = y.id 
where p1.date between '2011-06-01' and now(); -- just making up an example 
and p1.gender = 'female'; -- for example 

一些解釋:

短語(@rank := @rank + 1)增加變量返回已被賦予別名rank的增量結果。

最後的x是查詢結果的別名,並且是語法所需的(但任何別名都會這樣做 - 我只是選擇了x)。有必要使用內部查詢,因爲這是提供排序的內容 - 在完成之前不能添加排名。

注:
任何地方,你想在查詢必須發生的條款或其他命令的處理 - 外查詢只的秩處理 - 它採用最後查詢行,並增加了它的排名。

+0

之前添加了WHERE子句我認爲這是正確的答案,但在我看來,這不是我正在尋找的答案。如果我向外部查詢添加where子句,排名似乎不正確。它不會返回參與者的ABSOLUTE排名。絕對排名,意思是這個參與與所有參與者相比有多少票。 – ThomasM

+0

@ThomasM:我認爲你應該嘗試在子查詢中加入'(@rank:= @rank + 1)作爲rank''。因此,外部選擇只應該拉'排名',而不是計算它。過濾應該仍然可以應用於外部選擇。 –

+0

是的,這聽起來更邏輯了,雖然它仍然不是正確的結果集,根據我正在執行的測試...我猜這是因爲ORDER BY發生在排名計算之後。 – ThomasM