2017-01-25 60 views
0

我真的不知道该怎么称呼这个问题,所以这是我最好的猜测。mysql order by multiple occurence

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

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 - 易分至5硬盘有一定的难度不同的“问题”。上面的表格是每个用户都在解决问题并说他们解决问题的难度。

我想要的是得到一个“前50名”的名单,它将根据几件事情排名每个人。

  • 某人解决了难度为5的问题总是排名高于没有问题的人。即使其他人已经解决了难度为4的100个问题
  • 如果两个人解决了难度为5的同样数量的问题,则其转到userDifficulty列,以便如果一个用户说它是1难度对他们来说,他们的排名会高于排名相同的问题,因此他们的排名将会高于那些解决了难度为4的最多问题的人......然后解决这个问题最简单。 ..然后谁解决了最多的3 ... ...并解决它们最简单

获取想法?均田?

这里是我迄今为止

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

任何帮助吗?

回答

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。

+0

感谢兄弟。你今天为我节省了很多时间。 – krummens

+0

你能解释第二个例子好一点吗? – krummens

0

应该使用DINAMIC选择表,你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 
+0

你能解释一下吗? – krummens

+0

@krummens。什么不明确? .. – scaisEdge

+0

't1'和't2'是什么? – krummens