поэтому у меня есть эта таблица;
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 >
как вы видите его суммированные суммы для каждого оружия для 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)
Я вроде как читаю между строками здесь, о чем я думаю, что вы ищите, а также предполагаете, что вы используете довольно недавнюю версию 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
надеюсь, я пойду в том направлении, куда вы пытались пойти.
Звучит так, как будто вы хотите один ряд за оружие, с максимальной точностью, достигнутой любым игроком. Если да, попробуйте следующее:
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