Problème GROUP BY

Problème GROUP BY - SQL/NoSQL - Programmation

Marsh Posté le 27-01-2010 à 14:25:27    

Bonjour,  
Je crée un classement automatique des joueurs sur mon serveur mais je bloque à ce niveau.
Pour pouvoir participer au classement général, un joueur doit avoir totalisé au moins 1000 points et avoir joué au moins 1 heure.
J'y suis arrivé pour le classement individuel mais pas pour le classement par équipe. En effet, certains joueurs ont une équipe et avec ma requête ci dessous les points minimums et temps minimums sont affectés au clan entier. Hors, j'aimerais que seuls soient pris en compte les joueurs ayant chacun satifsfaits les conditions nécessaires pour être dans le classement général.
 
J'ai pensé à plusieurs choses comme :

Code :
  1. WHERE [...] players.player_id IN (SELECT retournant IDs des joueurs du classement général)


Mais comme il n'y a qu'un player_id par ligne ça ne peut pas fonctionner.
 
Voici la requête actuelle :

Code :
  1. SELECT clans.clan_tag, clans.clan_id, SUM(scores.played_time) AS played_time, SUM(scores.frags) AS frags,
  2.  SUM(scores.gibs) AS gibs, SUM(scores.teamkills) AS teamkills, SUM(scores.teamgibs) AS teamgibs, SUM(scores.suicides) AS suicides,
  3. SUM(scores.deaths) AS deaths, SUM(scores.ctfscore) AS ctfscore, SUM(scores.htfscore) AS htfscore,
  4. SUM(scores.ktfscore) AS ktfscore, SUM(scores.RETURN) AS `return`, SUM(scores.steal) AS steal, SUM(scores.points) AS points
  5. FROM scores
  6. INNER JOIN players ON scores.player_id = players.player_id
  7. LEFT JOIN clans ON players.player_clan = clans.clan_id
  8. WHERE scores.date LIKE '$date' AND players.player_clan GROUP BY clans.clan_id
  9. HAVING SUM(scores.points) >= 1000 AND SUM(scores.played_time) > 3600
  10. ORDER BY SUM(points)/SUM(played_time)
  11. DESC LIMIT 50


 
Merci ;)


Message édité par Profil supprimé le 27-01-2010 à 14:26:33
Reply

Marsh Posté le 27-01-2010 à 14:25:27   

Reply

Marsh Posté le 27-01-2010 à 14:41:05    

Hmmm, j'ai pas tout compris...
 
Bon, alors on commence doucement :
 
Liste des joueurs éligibles au classement général :

Code :
  1. SELECT p.player_id, p.player_clan, sum(s.points) points, sum(s.played_time) time, etc.
  2. FROM players p
  3. INNER JOIN scores s ON s.player_id = p.player_id
  4. HAVING sum(s.points) >= 1000 AND sum(s.played_time) > 3600
  5. GROUP BY p.player_id, p.player_clan


 
Bon, ensuite, on cherche avec les équipes :

Code :
  1. SELECT c.clan_tag, c.clan_id, sum(j.time) played_time, etc.
  2. FROM clans c
  3. INNER JOIN (
  4.  SELECT p.player_id, p.player_clan, sum(s.points) points, sum(s.played_time) time, etc.
  5.  FROM players p
  6.  INNER JOIN scores s ON s.player_id = p.player_id
  7.  HAVING sum(s.points) >= 1000 AND sum(s.played_time) > 3600
  8.  GROUP BY p.player_id, p.player_clan
  9. ) j ON j.player_clan = c.clan_id
  10. GROUP BY c.clan_tag, c.clan_id
  11. ORDER BY sum(j.points) / sum(j.time) DESC
  12. LIMIT 1, 50


 
 
Je suis sûr de rien, mais ça me semble repondre à ta question.

Reply

Marsh Posté le 27-01-2010 à 14:52:19    

Merci pour ta réponse, je regarde ça tout de suite.

Reply

Marsh Posté le 27-01-2010 à 15:17:26    

Merci beaucoup ! Ca marche !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed