多次出现的mysql顺序

时间:2017-01-25 18:24:30

标签: mysql ranking

我真的不知道如何标题这个问题,所以这是我最好的猜测。

这是我的问题。我有一张看起来像这样的表:

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名"列出根据一些事情对每个人进行排名的地方。

  • 解决难度为5的问题的人总是排名高于没有问题的人。即使对方已经解决了难度为4的100个问题
  • 如果两个人解决了相同数量的难度为5的问题,那么它会转到userDifficulty列,这样如果一个用户说他们有1个难度,那么他们的排名会高于某人谁排名与3
  • 相同的问题
  • 在此之后,任何以4难度解决了大多数问题的人都会去...然后最简单地解决它......然后谁解决了最多的问题...并且解决了他们最简单

明白了吗?有点?

这是我到目前为止所拥有的

SELECT COUNT( * ) , personID
FROM table
WHERE actualDifficulty =5
GROUP BY personID
ORDER BY userDifficulty ASC
LIMIT 0 , 50

任何帮助?

2 个答案:

答案 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