[RESOLU] Position dans Classement Avec total de SUM()

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Position dans Classement Avec total de SUM()

Re: Position dans Classement Avec total de SUM()

par moogli » 23 févr. 2014, 15:37

salut,

la structure de la table ainsi qu'un jeux de données c'est plus facile.

donc a priori 4 colonnes "jeux" ?
si oui c'est un défaut de conception (quand tu aurais 58 jeux il y aura 58 colonnes jeux ?).
il te faut une table jeux et une table qui fait la jointure entre les deux.

pour les tests j'ai utiliser cette table (vu que tu utilise mysql me suis permis d'utiliser du code spécifique mysql).
[mysql]
CREATE TABLE `clans_table` (
`id_clan` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`points_jeux1` INT(11) NOT NULL DEFAULT '0',
`points_jeux2` INT(11) NOT NULL DEFAULT '0',
`points_jeux3` INT(11) NOT NULL DEFAULT '0',
`points_jeux4` INT(11) NOT NULL DEFAULT '0',
`nom` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id_clan`)
);
[/mysql]

ensuite il faut toujours tester les requêtes dans un client mysql (comme phpmyadmin, mysql workbench ou encore heidisql).
au premier essai tu as une erreur au niveau du as dans le where.
pourquoi ?
parce que l'on ne donne un alias que dans le select ou sur un table (from / join).

Avec ma table exemple le group by n'a pas de sens (id_clan est la pk donc unique par nature) vu le nom de la table cela me semble logique.
est ce le cas pour toi ?

La solution c'est de retirer l'alias, le group by et le order by qui sont inutile (parce que tu ne demande qu'une seule ligne, et pas le rang de tout le monde, si c'est le cas tu le fait en php avec un incrément ;)
si tu veux la valeur tu doit faire une autre requête.
[mysql]
SELECT COUNT(1)+1
FROM clans_table
WHERE
(points_jeux1 + points_jeux2 + points_jeux3 + points_jeux4) > (
SELECT (points_jeux1 + points_jeux2 + points_jeux3 + points_jeux4)
FROM clans_table
WHERE id_clan=1)
[/mysql]

avec un autre sgbd je t'aurais proposé une solution sql adapté avec dense rank mais la pas moyen :/ (non implémenter dans mysql)

@+

Position dans Classement Avec total de SUM()

par gdc » 23 févr. 2014, 01:39

Bonsoir,

J'aimerai pouvoir afficher dans le haut de la page d'un concours pour un clan (Groupe) de joueurs, ma fonction effectue un SUM() sur plusieur colone et ensuite je dois rechercher la position de ce clan et afficher au joueur que son clan est présentement X eme position.

Je suis capable de le faire pour simple colone sans de SUM mais pas avec le SUM de plusieur colone,

Voice ce que j'ai pour le moment mais ca ne marche pas,
$requete3 = mysql_query("SELECT count(*)+1 as mem FROM clans_table 
		WHERE (sum(points_jeux1) + sum(points_jeux2)  + sum(points_jeux3) + sum(points_jeux4)) as sum1 >
 		(SELECT (sum(points_jeux1) + sum(points_jeux2)  + sum(points_jeux3) + sum(points_jeux4)) 
			FROM clans_table WHERE id_clan='".$row['id_clan']."') GROUP BY id_clan ORDER BY mem DESC ");

	$data3= mysql_fetch_array($requete3);
           echo 'Votre clan est présentement <b> ' .$data3['mem'].'</b> eme au classement avec ' .$data3['sum1']. ' Points ';

MERCI DE VOTRE AIDE.