這是原始數據,並且希望根據分數(count(tbl_1.id))對它們進行排名。MySQL + PHP:優化排名查詢並計數子查詢
[tbl_1]
===========
id | name
===========
1 | peter
2 | jane
1 | peter
2 | jane
3 | harry
3 | harry
3 | harry
3 | harry
4 | ron
因此,讓臨時表(tbl_2)計算每個id的分數。
SELECT id, name, COUNT(id) AS score
FROM tbl_1
GROUP BY id
ORDER BY score DESC;
LIMIT 0, 30;
然後結果是;
[tbl_2]
===================
id | name | score
===================
3 | harry | 4
1 | peter | 2
2 | jane | 2
4 | ron | 1
然後查詢這個;
SELECT v1.id, v1.name, v1.score, COUNT(v2.score) AS rank
FROM votes v1
JOIN votes v2 ON v1.score < v2.score
OR (
v1.score = v2.score
AND v1.id = v2.id
)
GROUP BY v1.id, v1.score
ORDER BY v1.rank ASC, v1.id ASC
LIMIT 0, 30;
然後結果是;
==========================
id | name | score | rank
==========================
3 | harry | 4 | 1
1 | peter | 2 | 2
2 | jane | 2 | 2
4 | ron | 1 | 4
是否可以在一個事務(查詢)中很好地做到這一點?
謝謝你的非常明確的解釋和美妙的代碼!我嘗試了以前的代碼(SELECT @a,@a:= @ a + 1 ...),但它沒有在相同分數上返回正確的排名。非常感謝:) – chloe 2012-08-06 19:27:24
第一部分代碼是你完成這項工作所需要的一部分。這是子查詢重複兩次,代替你的「投票」表格,在你正確的查詢中。如果有幫助,可以接受Stack Overflow的答案。點擊綠色複選框。 – 2012-08-06 21:36:02