Select ID 拥有另一个 ID 的最大计数

Select ID having maximum count of another ID

我有一个棒球比赛数据库,其中包含 PlayerID 和 TypeID(比赛类型:双打、三振等)。数据看起来像这样:

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

我正在尝试找出哪些球员在每种比赛中发挥得最好。例如。 Jim (PlayerID 3) 的三振次数最多 (TypeID 7) 和 Bob (PlayerID 2) 的主场 运行s (TypeID 4) 最多,这应该导致以下 table:

+----------+--------+----------------+
| 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;

returns 每种类型的正确最大值,但是关联的 PlayerID 都是错误的,我不明白为什么。我确定我遗漏了一些简单的东西(或使它过于复杂)但无法弄清楚。有什么想法吗?

这行得通吗?

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

这部分查询块returns每个typeid的最大播放次数:

(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 的回答,因为它更优雅。

在 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

您还必须将 playerid 列也放在 group by 子句中。 休息一切正常

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