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 具有最大计数的计数。
说了这么多,我其实更喜欢@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;
我有一个棒球比赛数据库,其中包含 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 具有最大计数的计数。
说了这么多,我其实更喜欢@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;