2010-09-27 8 views
0

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;

http://pastebin.com/Q1N5mScU

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) 
+1

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. –

+0

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?) –

+0

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

Répondre

0

Je suis une sorte de lecture entre les lignes ici de ce que je pense que votre recherche et en supposant également votre sur une version assez récente de MySQL (besoins support de table dérivée), même si je ne suis pas tout à fait sur ce Vous cherchez peut-être cela vous indiquera la bonne direction.

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 

J'espère que je vais dans la direction où vous essayiez d'aller.

+0

c'est la direction je vais mais il semble toujours échouer à obtenir le bon joueur_id ..Altho il semble que l'acc est correct (la plupart sortent à 99% ce qui est à peu près juste) – minky

+0

vous voulez que le players_id aussi devrait juste être un tweak pour sélectionner weapons_id, players_id, max (acc) de (select weapons_id, players_id, avg (acc) comme acc du groupe player_weapon_stats par players_id, weapons_id) comme t1 group par weapons_id – jcrummack

+0

a changé la réponse initiale ci-dessus pour inclure le players_id dans la sortie aussi – jcrummack

0

Il semble que vous vouliez une ligne par arme, avec la précision maximale obtenue par n'importe quel joueur.Si oui, essayez ce qui suit:

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

une ligne par arme avec le maximum acc moyen par n'importe quel joueur sur autant de matches qu'ils ont été impliqués .. votre requête semble retourner le total des statistiques pour tous les joueurs combinés et comme jcrummack il ne retourne pas le correct players_id – minky

+0

@minky: ma requête devrait renvoyer la précision maximale obtenue par un joueur, ainsi que les valeurs totales pour * tous * les joueurs. –

+0

ok mais ce que j'ai vraiment besoin de la requête pour retourner est non seulement le max acc pour chaque arme mais aussi les détails associés à ce acc (les détails étant le total hits/shots/kills pour ce spécifique players_id/weapons_id) peut-être si vous voyez le site que vous pouvez comprendre ce que j'essaie (mal) d'expliquer http://minky.mine.nu/cpmpickup/stats – minky