MySQL группа по путанице

0

поэтому у меня есть эта таблица;

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)

с большим количеством строк (в настоящее время около 400 тыс.), например:

mysql > выберите * 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)

поэтому записано несколько характеристик оружия на игрока за матч.

то, что я пытаюсь сделать, - получить максимальную acc для каждого оружия_id на основе общей суммы каждого игрока

возвращаемые строки должны быть равны в количестве до количества оружия (в данном случае 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

ive попробовал много вариаций вышеизложенного и все, что еще пришло в голову в то время, но я все еще застрял.. Я думаю, что я слишком долго смотрел на него

Кто-нибудь может мне помочь?

---- edit

данные примера, которые я использовал, слишком малы для компиляции в результаты, так как для каждого weapon_id будет несколько записей для каждого оружия_id, которое затем будет добавлено вместе, чтобы сформировать "средний/общий" для этого игрока/оружия;/p >

http://pastebin.com/Q1N5mScU

как вы видите его суммированные суммы для каждого оружия для 4 игроков.. так что ожидаемый результат будет похож на этот, но просто на одну строку на оружие

im не уверен, как еще объяснить это

---- 2nd edit

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)

---- 3rd edit

то, что кажется решением, основанным на запросах 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)
  • 1
    Это не имеет смысла для меня, но было бы легче, если бы вы опубликовали ожидаемые результаты на основе данных примера, которые вы опубликовали.
  • 0
    Итак, вы хотите, чтобы на каждый ряд arms_id был указан один ряд, а также максимальный вес, достигнутый любым игроком, и идентификатор игрока, который его достиг? (А что, если более одного игрока достигает максимума?)
Показать ещё 1 комментарий
Теги:
group-by
aggregate-functions

2 ответа

0
Лучший ответ

Я вроде как читаю между строками здесь, о чем я думаю, что вы ищите, а также предполагаете, что вы используете довольно недавнюю версию 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

надеюсь, я пойду в том направлении, куда вы пытались пойти.

  • 0
    это направление, в котором я иду, но все еще кажется, что он не может получить правильный Players_id. Хотя, похоже, что акк является правильным (большинство выходит на 99%, что примерно так)
  • 0
    Вы хотите, чтобы Players_id тоже должен был просто настроить Weapon_id, Players_ID, Max (Acc) из (выберите arms_id, Players_id, AVG (Acc) в качестве acc из группы player_weapon_stats по Players_id, Weapons_id) в качестве группы t1 по arms_id
Показать ещё 5 комментариев
0

Звучит так, как будто вы хотите один ряд за оружие, с максимальной точностью, достигнутой любым игроком. Если да, попробуйте следующее:

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
  • 0
    по одному ряду на оружие с максимальным средним значением, полученным любым игроком за любое количество матчей, в которых они участвовали. Ваш запрос, похоже, возвращает общую статистику по всем игрокам вместе взятым, и, как и в случае с jcrummack, он не возвращает верный player_id
  • 0
    @minky: мой запрос должен возвращать максимальную точность, достигнутую любым игроком, вместе с общими значениями для всех игроков.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню