这是原始数据,并且希望根据分数(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