donc j'ai cette table;groupe mysql par confusion
mysql> décrire 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)
avec beaucoup de lignes (actuellement environ 400k) comme ceci;
mysql> select * à partir de 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)
si plusieurs statistiques d'armes par joueur par match sont enregistrés
ce que im essayant de faire est d'obtenir le meilleur acc pour chaque weapon_id basée sur la somme totale de chaque joueur
les lignes retournées devrait être égal en nombre au nombre d'armes (dans ce cas 8)
c'est ce que j'ai essayé;
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 essayé beaucoup de variations de ce qui précède et tout ce venu à l'esprit à l'époque mais im toujours bloqué .. Je pense que ive Fixant trop longtemps
quelqu'un peut me aider?
---- modifier
les données de l'échantillon i utilisé est un peu trop petit pour compiler dans les résultats car il y aurait plusieurs entrées pour chaque weapons_id pour chaque players_id qui seraient ensuite additionnés pour former une « moyenne/global "pour ce joueur/arme;
que vous voyez ses totaux additionnés pour chaque arme pour les 4 joueurs .. donc le résultat attendu serait similaire à celle mais simplement une ligne par arme
je ne suis pas sûr de savoir comment d'autre expliquer
---- 2ème édition
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)
---- 3ème édition
ce qui semble être la solution basée sur les requêtes 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)
Cela n'a pas de sens pour moi, mais ce serait plus simple si vous publiiez les résultats attendus en fonction des exemples de données que vous avez publiés. –
alors voulez-vous une ligne par weapons_id, avec le maximum d'acc obtenu par n'importe quel joueur et l'ID du joueur qui l'a atteint? (Et si plus d'un joueur atteint le maximum?) –
oui c'est à peu près ça .. mais il devrait être la précision maximale moyenne basée sur le nombre de matches que le joueur a joué (1-1000 +) .. si le le joueur a joué en 10 matchs puis ils ont 10 entrées pour chaque arme .. donc ils seraient ajoutés/moyennés puis je reçois le maximum acc à partir de ces chiffres – minky