2015-06-16 37 views
2

我有一個PlayerID和TypeID棒球比賽的數據庫(類型的遊戲:雙,罷工等)。數據看起來像這樣:選擇ID有最大數量的另一個ID

+----------+--------+ 
| playerid | typeid | 
+----------+--------+ 
|  2 |  4 | 
|  2 |  4 | 
|  2 |  7 | 
|  3 |  7 | 
|  3 |  7 | 
|  3 |  7 | 
|  3 |  26 | 
|  3 |  7 | 

我試圖找到哪些玩家有最大的每種遊戲。例如。吉姆(PlayerID 3)有最擊奏(TYPEID 7)和Bob(PlayerID 2)有最本壘打(TYPEID 4)這將導致如下表所示:

+----------+--------+----------------+ 
| playerid | typeid | max(playcount) | 
+----------+--------+----------------+ 
|  2 |  4 |    12 | 
|  3 |  7 |    9 | 
|  3 |  26 |    1 | 

我最好的嘗試迄今運行:

SELECT playerid,typeid,MAX(playcount) FROM 
(
SELECT playerid,typeid,COUNT(*) playcount FROM plays GROUP BY playerid,typeid 
) AS t GROUP BY typeid; 

它返回每種類型的適當的最大值,但相關的PlayerIDs都錯了,我想不通爲什麼。我確信我錯過了一些簡單的東西(或者使這個過於複雜),但無法弄清楚。有任何想法嗎?

回答

2

在MySQL這個組=明智的最大值,它可悲的不是一個簡單的,因爲你想它是。

這裏有一個辦法做到這一點使用類似的方法是什麼在ROW_NUMBER() in MySQL

SELECT a.* 
    FROM (
     SELECT playerid 
       ,typeid 
       ,COUNT(*) playcount 
      FROM plays 
     GROUP BY playerid,typeid 
     ) a 
    LEFT JOIN 
     (
     SELECT playerid 
       ,typeid 
       ,COUNT(*) playcount 
      FROM plays 
     GROUP BY playerid,typeid 
     ) b 
    ON a.typeid = b.typeid 
    AND a.playcount < b.playcount 
WHERE b.playerid IS NULL 
+0

除了「@lay」而不是「plays」之外,它是完美的。我一直看到這種事情,並沒有意識到它實際上做了我想做的事情。謝謝! – vityav

1

這項工作?

SELECT 
    playertypecounts.* 
FROM 
    (SELECT 
     playerid, 
     typeid, 
     COUNT(*) as playcount 
    FROM plays 
    GROUP BY playerid, typeid) playertypecounts 
INNER JOIN 
    (SELECT 
     typeid, 
     MAX(playcount) as maxplaycount 
    FROM 
     (SELECT 
      playerid, 
      typeid, 
      COUNT(*) as playcount 
     FROM plays 
     GROUP BY playerid, typeid) playcounts 
    GROUP BY typeid) maxplaycounts 
ON playertypecounts.typeid = maxplaycounts.typeid 
AND playertypecounts.playcount = maxplaycounts.maxplaycount 

查詢塊的該部分返回每個typeid的最大playcount:

(SELECT 
    typeid, 
    MAX(playcount) as maxplaycount 
FROM 
    (SELECT 
     playerid, 
     typeid, 
     COUNT(*) as playcount 
    FROM plays 
    GROUP BY playerid, typeid) playcounts 
GROUP BY typeid) maxplaycounts 

然後,它以過濾那些計數內接於所有的typeid/playcounts在玩家(一個或多個)對於任何給定的typeid都有最大的計數。

請參閱SQLFiddle example

說了這麼多,我其實更喜歡@KarlKieninger的答案,因爲它更優雅。

+0

我不太清楚這是什麼回報。這是正確的格式,但沒有任何數據對齊(錯誤的球員有錯誤的類型和每種類型的最大值是錯誤的)。它看起來幾乎和其他答案一樣,除了作爲內部聯接和選擇最大值外。不知道爲什麼會混淆它呢? – vityav

1

建議您by子句把playerid柱也在組。 休息一切都好。

SELECT playerid,typeid,MAX(playcount) FROM 
(
SELECT playerid,typeid,COUNT(*) playcount FROM plays GROUP BY playerid,typeid 
) AS t GROUP BY playerid,typeid; 
+0

這似乎與計算每位選手的比賽數量相同 – vityav