MySQL GROUP BY - 限制为前 X 条记录

标签 mysql group-by

我在网上仔细看了看,似乎很多人都有类似的问题,但我似乎无法找到解决我的问题的明确方法。

为了提供一些背景信息,我正在运营一个体育网站,并且有一个包含过去结果的数据库 - 跨越数千条记录。

下面是一些示例数据-(表名:匹配)

| match_id | manager_id | outcome |
| -------- | ---------- | ------- |
|        1 |          1 |       W |
|        2 |          1 |       D |
|        3 |          1 |       D |
|        4 |          2 |       L |
|        5 |          2 |       L |
|        6 |          2 |       W |
|        7 |          2 |       D |
|        8 |          2 |       L |
|        9 |          2 |       L |
|       10 |          3 |       W |
|       11 |          3 |       W |
|       12 |          3 |       W |
|       13 |          3 |       W |
|       14 |          3 |       D |
|       15 |          3 |       D |
|       16 |          4 |       L |
|       17 |          4 |       L |
|       18 |          4 |       D |
|       19 |          5 |       W |
|       20 |          5 |       W |

我想做的是计算每个经理的匹配次数以及结果 - 我通过使用此查询实现了这一点。

SELECT
`manager_id`,
COUNT(*) AS `played`,
SUM(`outcome` = 'W') AS `won`,
SUM(`outcome` = 'D') AS `drawn`,
SUM(`outcome` = 'L') AS `lost`,
ROUND((SUM(`outcome` = 'W')/COUNT(*)) * 100, 0) AS `win_percentage`
FROM
`matches`
GROUP BY `manager_id`

查询结果

| manager_id | played | won | drawn | lost | win_percentage |
| ---------- | ------ | --- | ----- | ---- | -------------- |
|          1 |      3 |   1 |     2 |    0 |             33 |
|          2 |      6 |   1 |     1 |    4 |             16 |
|          3 |      6 |   4 |     2 |    0 |             66 |
|          4 |      3 |   0 |     1 |    2 |              0 |
|          5 |      2 |   2 |     0 |    0 |            100 |

这一切都很好,而且相对简单。

然而,我想要实现的是根据每个 manager_id 的前 X 条记录找出完全相同的数据。

例如,假设我想要每个经理前两场比赛的上述数据。我应该得到如下结果。

| manager_id | played | won | drawn | lost | win_percentage |
| ---------- | ------ | --- | ----- | ---- | -------------- |
|          1 |      2 |   1 |     1 |    0 |             50 |
|          2 |      2 |   0 |     0 |    2 |              0 |
|          3 |      2 |   2 |     0 |    0 |            100 |
|          4 |      2 |   0 |     0 |    2 |              0 |
|          5 |      2 |   2 |     0 |    0 |            100 |

以上只是一个示例,实际上,我们将搜索每个组的前 50 或 100 个匹配项。

如果我能在这里得到任何支持,我将不胜感激。

最佳答案

由于 MySql 中没有窗口函数,您可以使用 this post 中描述的变量.

set @howmany := 2;

SELECT
  manager_id,
  COUNT(*) AS played,
  SUM(outcome = 'W') AS won,
  SUM(outcome = 'D') AS drawn,
  SUM(outcome = 'L') AS lost,
  ROUND((SUM(outcome = 'W')/COUNT(*)) * 100, 0) AS win_percentage
FROM
  (SELECT 
     match_id, 
     manager_id, 
     outcome, 
    CASE WHEN manager_id != @manager THEN @row := 1 
      ELSE @row := @row + 1 END as rownum,
    CASE WHEN manager_id != @manager THEN @manager := manager_id 
      ELSE @manager END as _
  FROM (SELECT * from matches ORDER BY manager_id, match_id) temp1
  JOIN (SELECT @manager := 0) temp2
  JOIN (SELECT @row := 0) temp3
  ) temp
WHERE temp.rownum <= @howmany
GROUP BY manager_id;

关于MySQL GROUP BY - 限制为前 X 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42881602/

相关文章:

mysql - 如何检查最后 3 行是否有相同的值?

mysql - 从按分钟计算的原始数据中按小时聚合 MySQL 数据

python - 两列中 groupby 的唯一值计数

php - 在取消设置 mysql 对象之前释放结果并关闭连接,或者只是取消设置会破坏对象 n 释放资源?

php - 选择具有动态内容的 MySQL 表

php - 如何创建具有特定编号的 MySQL 表。行数?

MySQL查询速度慢是因为单独的索引?

MySQL - 动态数据透视表分组问题

mysql - `MySQL GROUP BY 使用索引时速度较慢

mysql - 使用带有 WHILE 循环的 MySQL 存储函数生成随机且唯一的 PIN