2017-01-25 91 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