Calcul d'un rang avec 2 tables

Résolu
cs_Alpha911 Messages postés 88 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 13 août 2011 - 13 août 2011 à 12:48
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 13 août 2011 à 20:11
Bonjour,

Je me creuse la tête depuis hier et rien n'en sort ...
j'ai 2 tables comme ce qui suit :
*********** ************
* JOUEUR * * POINTS *
*********** ************
idjoueur *idpoint *
nomjoueur *idjoueur *
... *date *
----------- ************

Quand un joueur gagne 1 point une ligne est ajoutée systematiquement avec l'heure à laquelle il a gagné 1 seul point

Je souhaite faire afficher le rang

A savoir

Rang 1 DAMIEN avec 10 points
Rang 2 SYLVIE avec 6 points
...

je suis passé par pas mal de choses (sql count; creation d'un array_push, distinct)
rien y fait ...

Avez vous une piste ? une commande SQL ?, une solution qui sorte du cadre de sql ?

Merci

11 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 août 2011 à 15:10
bien :

SELECT count(points) AS points, id_joueur FROM points GROUP BY is_joueur ORDER BY points DESC


ça doit te donner le classement des joueurs (enfin leur id et leur nombre de points)
Si tu veux le nom, une jointure s'impose, mais ça reste du meme ordre.

SELECT count(points) AS points, id_joueur FROM points LEFT JOIN JOUEUR ON id_joueur GROUP BY is_joueur ORDER BY points DESC

un truc comme ça devrait fonctionner
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 août 2011 à 19:40
un truc comme ça ?

$classement = 1;
while($sqlfix = mysql_fetch_array($requete))
{

if($sqlfix == $idjoueur)
{ print_r($sqlfix) ;
echo $classement;
}

$classement ++;

}



Si tu pouvais donner l'erreur SQL, ça pourrait etre utile.
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 août 2011 à 13:55
Bonjour,

Qu'as tu tenté comme requetes ?

SELECT count(points) AS count, joueur FROM my_table GROUP BY joueur

Ca ne fonctionne pas ?

Cordialement,

Maxime
0
cs_Alpha911 Messages postés 88 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 13 août 2011
13 août 2011 à 14:42
Merci pour cette prise en charge,

SELECT count(points) AS count, joueur FROM points GROUP BY joueur
a été essayé mais me retourne aussi une erreur.

Je reprecise un peu comment sont organisés les tables si tu as une idée sachant que je souhaite faire un classement par rang

1 ere table JOUEUR

idjoueur, nomjoueur, prenomjoueur

2nde table POINTS

idpoint, datepoint, idjoueur

------------------------------------------
La table point s'incremente de ma manière suivante :
une ligne = 1 point on a donc la date à laquelle le point est gagné le total du score pour un joueur est généré par une requete de cette maniere

$id = $_GET['id'];
$sqlcalculpoint mysql_query("SELECT * FROM `POINTS` WHERE `idjoueur` '$id'");
$sommepointsjoueur = mysql_numrows($sqlcalculpoint);

Le soucis viens du fait que je n'arrive pas à trouver la logique pour sortir à la fin
un tableau ou le joueur est classé 36 ème sur 124 joueurs.

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Alpha911 Messages postés 88 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 13 août 2011
13 août 2011 à 17:23
Merci pour cette methode,

à present j'ai un tableau avec les joueurs :

SELECT count(points) AS points, id_joueur FROM points GROUP BY is_joueur ORDER BY points DESC

celui qui a le plus de point est en haut comment puis je afficher que ce joueur est 1 er ou 35 eme et uniquement ce joueur
exemple je suis sur la fiche du joueur n14 ($id = 14;) je veux qu'il connaisse uniquement son rang sans savoir qui est au dessu de lui ou en dessous
et sans lui donner le total de ses points.

Joueur 14 est 35 eme sur 114 membres.

Merci en tout ca grace à tes lumières ca progresse dans le bon sens.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 août 2011 à 17:44
hum... la requete est un peu plus complexe je n'ai rien sous la main pour la tester, mais ça devrait ressembler à ça :



SELECT COUNT(*) FROM

(SELECT count(points) AS points FROM points GROUP BY is_joueur
WHERE points >



)

Si c'est trop lent, ou si ça ne fonctionne pas, tu peux le faire en deux étapes :
1 tu recupères
SELECT count(points) AS points FROM points WHERE id_joueur = ID_DU_JOUEUR_COURRANT
qui est le score courrant.

2 tu récupères


SELECT COUNT(*) FROM
(SELECT count(points) AS points FROM points GROUP BY is_joueur
WHERE points > Resultat_precedent )

ça peut fonctionner.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 août 2011 à 17:45
Dsl, la requete a disparu...


SELECT COUNT(*) FROM

(SELECT count(points) AS points FROM points GROUP BY is_joueur
WHERE points >

(SELECT count(points) AS points FROM points WHERE id_joueur = ID_DU_JOUEUR_COURRANT)

)
0
cs_Alpha911 Messages postés 88 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 13 août 2011
13 août 2011 à 19:21
Merci,

Je n'arrives pas à le faire tourner. Mais bon la piste du

SELECT count( * ) AS points, idjoueur FROM points GROUP BY idjoueur ORDER BY `point` DESC

est une très bonne piste je pense qu'il doit exister en php cette fois ce qu'il faut pour afficher un enregistrement
par l'id avec une numerotation sans augmenter la charge de la requete sql.

Qu'en penses tu ?

je pense à ajouter dans la boucle while une condition d'affichage il me reste plus qu'à trouver ce qui me permet de numeroter
le resultat en php (si toutefois ceci est faisable).
0
cs_Alpha911 Messages postés 88 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 13 août 2011
13 août 2011 à 19:37
Je pense à une chose comme ca :

$requete = ("SELECT count( * ) AS points, idjoueur FROM points GROUP BY idjoueur ORDER BY `point` DESC");

while($sqlfix = mysql_fetch_array($requete))
{
if($sqlfix == $idjoueur)
{
fonction print_r($sqlfix)
}
}

ceci est approximatif pour le moment c'est la piste que je suis ....sachant que print_r donne la numerotation de l'affichage ...
Un avis ?
0
cs_Alpha911 Messages postés 88 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 13 août 2011
13 août 2011 à 20:05
Ce que tu as mis fonctionne parfaitement il ni a pas besoin du print_r($sqlfix)

je suis bien content

voila ce que j'avais pour la requete sql comme erreur :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE points > ( SELECT count( * ) AS points FROM points WHERE idjoueur = 61 ) ) LI' at line 1

j'ai mis des etoiles après les count car cela me retournait la même erreur et ca na rien changé. Cependant tu as tout à fait résolu le probleme concenant le calcul d'un rang avec 2 tables et je t'en suis très reconnaissant merci beaucoup.

Bien à toi.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
13 août 2011 à 20:11
de rien, bon weekend et au plaisir de répondre à tes questions sur phpcs :)
0
Rejoignez-nous