【问题标题】:mysql group by confusionmysql 分组混淆
【发布时间】:2010-09-27 05:01:09
【问题描述】:

所以我有这张桌子;

mysql> 描述 player_weapon_stats;

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| players_id | int(10) unsigned | NO   |     | NULL    |                |
| weapons_id | int(10) unsigned | NO   |     | NULL    |                |
| matches_id | int(10) unsigned | NO   |     | NULL    |                |
| hits       | int(10) unsigned | NO   |     | NULL    |                |
| shots      | int(10) unsigned | NO   |     | NULL    |                |
| kills      | int(10) unsigned | NO   |     | NULL    |                |
| acc        | decimal(4,2)     | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

有很多这样的行(目前大约 400k);

mysql> select * from player_weapon_stats ORDER BY id ASC LIMIT 5;

+----+------------+------------+------------+------+-------+-------+-------+
| id | players_id | weapons_id | matches_id | hits | shots | kills | acc   |
+----+------------+------------+------------+------+-------+-------+-------+
|  1 |          1 |          1 |          1 |    5 |     0 |     1 |  0.00 |
|  2 |          1 |          2 |          1 |  133 |   437 |     2 | 30.43 |
|  3 |          1 |          3 |          1 |  247 |   896 |     8 | 27.57 |
|  4 |          1 |          4 |          1 |    0 |    11 |     0 |  0.00 |
|  5 |          1 |          5 |          1 |   35 |    59 |     9 | 59.32 |
+----+------------+------------+------------+------+-------+-------+-------+
5 rows in set (0.02 sec)

因此每场比赛中每位玩家的多个武器统计数据都会被记录

我要做的是根据每个玩家的总和来获得每个武器 ID 的最高 acc

返回的行数应等于武器数量(在本例中为 8)

这是我尝试过的;

mysql> SELECT players_id, weapons_id, SUM(hits) AS hits, SUM(shots) AS shots, SUM(kills) AS kills, (FORMAT(hits / shots, 4) * 100) AS acc FROM player_weapon_stats GROUP BY weapons_id ORDER BY acc DESC;
// no player association so SUM totals up all players together

mysql> SELECT players_id, weapons_id, SUM(hits) AS hits, SUM(shots) AS shots, SUM(kills) AS kills, (FORMAT(hits / shots, 4) * 100) AS acc FROM player_weapon_stats GROUP BY weapons_id, players_id ORDER BY acc DESC, weapons_id ASC LIMIT 10;
// incorrect acc and around 25k rows returned

mysql> SELECT players_id, weapons_id, SUM(hits) AS hits, SUM(shots) AS shots, SUM(kills) AS kills, (FORMAT(hits / shots, 4) * 100) AS acc FROM player_weapon_stats GROUP BY players_id, weapons_id ORDER BY acc DESC, weapons_id ASC;
// appears correct acc, and correct totals but returns around 25k rows as well

我尝试了上述的很多变体以及当时想到的任何其他内容,但我仍然坚持..我认为我盯着它太久了

谁能帮帮我?

----编辑

我使用的样本数据太小而无法编译成结果,因为每个玩家 ID 的每个武器 ID 都会有多个条目,然后将它们加在一起形成该玩家/武器的“平均/总体”;

http://pastebin.com/Q1N5mScU

正如您看到的那样,4 名玩家的每种武器的总和......所以预期的结果将与此相似,但每个武器只有一行

我不知道该怎么解释它

---- 第二次编辑

mysql> SELECT players_id, weapons_id, MAX(acc) FROM (SELECT weapons_id, players_id, AVG(acc) AS acc FROM player_weapon_stats GROUP BY players_id, weapons_id) AS t1 GROUP BY weapons_id;
    +------------+------------+-----------+
    | players_id | weapons_id | MAX(acc)  |
    +------------+------------+-----------+
    |          1 |          0 | 25.000000 |
    |          1 |          1 |  0.000000 |
    |          1 |          2 | 84.995000 |
    |          1 |          3 | 99.990000 |
    |          1 |          4 | 99.990000 |
    |          1 |          5 | 94.290000 |
    |          1 |          6 | 70.250000 |
    |          1 |          7 | 99.990000 |
    |          1 |          8 | 99.990000 |
    +------------+------------+-----------+
    9 rows in set (0.33 sec)

---- 第三次编辑

似乎是基于 jcrummacks 查询的解决方案;

mysql> SELECT players_id, weapons_id, hits, shots, kills, MAX(acc) FROM ( SELECT players_id, weapons_id, SUM(hits) AS hits, SUM(shots) AS shots, SUM(kills) AS kills, AVG(acc) AS acc FROM player_weapon_stats GROUP BY players_id, weapons_id ORDER BY weapons_id ASC, AVG(acc) DESC) AS t1 GROUP BY weapons_id;
+------------+------------+------+-------+-------+-----------+
| players_id | weapons_id | hits | shots | kills | MAX(acc)  |
+------------+------------+------+-------+-------+-----------+
|        202 |          0 |    1 |     3 |     0 | 25.000000 |
|       1544 |          1 |    1 |     0 |     0 |  0.000000 |
|       3034 |          2 |    8 |    11 |     0 | 84.995000 |
|        952 |          3 |   16 |    16 |     0 | 99.990000 |
|       3493 |          4 |    1 |     1 |     0 | 99.990000 |
|        839 |          5 |   33 |    35 |     2 | 94.290000 |
|        734 |          6 |  366 |   521 |     5 | 70.250000 |
|       2643 |          7 |    1 |     1 |     0 | 99.990000 |
|       3227 |          8 |    1 |     1 |     0 | 99.990000 |
+------------+------------+------+-------+-------+-----------+
9 rows in set (0.72 sec)

【问题讨论】:

  • 这对我来说没有意义,但是如果您根据您发布的示例数据发布预期结果会更容易。
  • 那么你想要每个武器id 一行,以及任何玩家达到的最大acc 和达到它的玩家的ID 吗? (如果不止一名玩家达到最大值怎么办?)
  • 是的,差不多就是这样.. 但它应该是基于玩家参加过的比赛的最大平均准确度(1-1000+).. 如果玩家参加了 10 场比赛然后他们为每种武器有 10 个条目.. 所以他们将被添加/平均然后我从这些数字中获得最大的 acc

标签: sql mysql group-by aggregate-functions


【解决方案1】:

我正在阅读我认为您正在寻找的内容,并假设您使用的是相当新的 mysql 版本(需要派生表支持),即使我不太了解您正在寻找的东西这将为您指明正确的方向。

select
  players_id,
  weapons_id,
  max(acc)
from (
  select
    weapons_id,
    players_id,
    avg (acc) as acc
  from
    player_weapon_stats
  group by
    players_id,
    weapons_id
  order by 
    weapons_id asc, 
    avg(acc) desc) as t1
group by 
  weapons_id

希望我会朝着你想要的方向前进。

【讨论】:

  • 这是我前进的方向,但它似乎仍然无法获得正确的 player_id.. 尽管 acc 似乎是正确的(大多数出现在 99% 左右,这是正确的)
  • 你想要的 player_id 也应该只是一个调整,从 player_weapon_stats group by player_id, weapon_id 中选择武器 ID,players_id,max(acc) 为t1 按武器 ID 分组
  • 更改了上面的初始答案,将 player_id 也包含在输出中
  • 好吧,是的,我尝试添加 player_id,但结果不正确(请参阅主帖上的新编辑)
【解决方案2】:

这听起来好像你想要每把武器一排,任何玩家都能达到最高的准确度。如果是这样,请尝试以下操作:

SELECT weapons_id, 
       SUM(hits) AS hits, 
       SUM(shots) AS shots, 
       SUM(kills) AS kills, 
       MAX(acc) AS acc 
FROM (SELECT players_id, 
             weapons_id, 
             SUM(hits) AS hits, 
             SUM(shots) AS shots, 
             SUM(kills) AS kills, 
             FORMAT(SUM(hits) / SUM(shots), 4) * 100 AS acc 
      FROM player_weapon_stats 
      GROUP BY players_id, weapons_id) SQ
GROUP BY weapons_id

【讨论】:

  • 每把武器一行,无论他们参与了多少场比赛,任何玩家的最大平均acc..您的查询似乎返回了所有玩家组合的总统计数据,就像jcrummack一样,它没有返回正确的players_id
  • @minky:我的查询应该返回任何一个玩家达到的最大准确度,以及所有个玩家的总值。
  • 好的,但我实际上需要查询返回的不仅是每种武器的最大 acc,还有与该 acc 相关的详细信息(详细信息是该特定 player_id 的总命中/射击/杀死/weapons_id) 也许如果您查看该站点,您可能会理解我试图(糟糕地)解释的内容minky.mine.nu/cpmpickup/stats
猜你喜欢
  • 2014-03-19
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多