我真的不知道如何标题这个问题,所以这是我最好的猜测。
这是我的问题。我有一张看起来像这样的表:
Structure
__________________
problemID | actualDifficulty | personID | userDifficulty
Rows
__________________
39414 | 5 | 100001| 1
39414 | 5 | 100000| 1
39411 | 5 | 100000| 3
39411 | 5 | 100001| 3
39416 | 4 | 100001| 4
39413 | 3 | 100001| 3
39415 | 1 | 100001| 1
39412 | 1 | 100001| 1
39412 | 1 | 100000| 1
所以有很多不同的问题"在1-easy to 5-hard的范围内有一定的难度。上面的表格是每个用户都在解决问题并说明他们解决问题的难度。
我想要的是获得前50名"列出根据一些事情对每个人进行排名的地方。
userDifficulty
列,这样如果一个用户说他们有1个难度,那么他们的排名会高于某人谁排名与3 明白了吗?有点?
这是我到目前为止所拥有的
SELECT COUNT( * ) , personID
FROM table
WHERE actualDifficulty =5
GROUP BY personID
ORDER BY userDifficulty ASC
LIMIT 0 , 50
任何帮助?
答案 0 :(得分:1)
这将根据用户解决的最难问题对用户进行排名。我提出这不是因为它回答了你的问题,而是因为它很简单。
SELECT COUNT(*) num,
MAX(actualDifficulty) actuaDifficulty,
MAX(userDifficulty) userDifficulty,
personID
FROM probs
GROUP BY personID
ORDER BY 2 DESC, 3 DESC, 1 DESC
LIMIT 0 , 50
(注意我在ORDER BY
子句中使用了列序号来简化。)
以下是您问题的实际答案。这取决于MySQL的花絮,表达式actualDifficulty = 5
的值为1
,如果为真,则为0
。所以有一个很好的小SUM(actualDifficulty = 5)
黑客可能。 (http://sqlfiddle.com/#!9/57612b/1/0)
SELECT COUNT(*) num,
SUM(actualDifficulty = 5) actual5, /* count of actualDiff = 5 */
SUM(userDifficulty = 5) user5, /* count of userDiff = 5 */
SUM(actualDifficulty = 4) actual4, /* count of actualDiff = 4 */
SUM(userDifficulty = 4) user4, /* count of userDiff = 4 */
SUM(actualDifficulty = 3) actual3, /* etc.... */
SUM(userDifficulty = 3) user3,
SUM(actualDifficulty = 2) actual2,
SUM(userDifficulty = 2) user2,
SUM(actualDifficulty = 1) actual1,
SUM(userDifficulty = 1) user1,
MAX(actualDifficulty) MaxActuaDifficulty,
MAX(userDifficulty) MaxUserDifficulty,
personID
FROM probs
GROUP BY personID
ORDER BY 2 DESC, 3 DESC, 4 DESC, 5 DESC, 6 DESC,
7 DESC, 8 DESC, 9 DESC, 10 DESC, 11 DESC
LIMIT 0 , 50
您的规范说您希望按照难以解决的问题数量对人员进行排名5. SUM(actualDifficulty = 5)
计算出来。它是结果集中的第二列,因此ORDER BY 2 DESC
对用户进行排名。
你接着说,如果两个用户已经解决了相同数量的难度5问题,那么你应该对用户难度较高的用户进行排名(我认为这就是你的意思)。所以下一个条款就这样命令。
等等难度为4,3,2,1。
答案 1 :(得分:0)
应该使用dinamic select for table coulg获得一般解决方案
select t1.personID, t1.actualDifficulty, t1.count_ad, t2.userDifficulty
from (
select personID, actualDifficulty, count(* ) as count_ad
from my_table
group by actualDifficulty
) t1
left join (
select distinct personID, userDifficulty
from my_table
) t2 on t1.personID = t2.personID
order by t1.actualDifficulty, t1.count_ad, t2.userDifficulty