Problème Mysql / while / do

Résolu
Signaler
Messages postés
67
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
10 juin 2011
-
Messages postés
67
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
10 juin 2011
-
Bonjour,
Je m'explique,
j'aimerais pouvoir avoir la position d'une table sans while ou do. En faite ma commande se fait comme ceci:

<?Php
$db = mysql_connect('localhost', ''.$db_users.'', ''.$db_pass.'');
mysql_select_db($db_name, $db);
$var 'SELECT * FROM users ORDER BY note ASC';
$i = 0;
do {
$data = mysql_fetch_asssoc($var);
if (!$data) {
break;
}
   if ($data['users'] != 'OmbreNoir') {
$i++;
   }
} while(true);
echo $i;
?>


Voilà cette commande vous montre se que je veux faire.. je veux retourner la position exacte de la personne ici OmbreNoir par rapport au NOTE exemple de table:
[id] [users          ][NOTE]
[01][OmbreNoir][6     ]
[02][Allo           ][5        ]
[03][Boh           ][7        ]
--------------------------
Si ont fait le do en haut OmbreNoir va être à la position 2 ($i = 2)
Mais si j'ai 10 000 tables, qui dois être rafraichit à chaque page de mon site parce que son classement est afficher sur mon site, je suis pas mal sur que sa va prendre beaucoup trop du cpu
Alors j'ai pensé qu'il avait peut-être un autre moyen de sortir la position sans faire le do...
Merci de bien vouloir m'aider..

10 réponses

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Ah, ok...

Si tu ne veux que trouver le classement... c'est très simple en fait :

select u.*,
    ( (select count(t.id) from utilisateurs as t where t.note > u.note ) + 1 ) as position
from utilisateurs as u
where u.nom='OmbreNoire'

Mieux ?
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Bien sur...

Donc, c'est une requête avec une sous requête.

La requête principale P(N) :
select *               -- récupérer les champ
from utilisateur -- de l'utilisateur
where nom=N   -- s'appelant N

Prenons la sous requête S(N) :
select count(id) -- compter le nombre
from utilisateur -- des utilisateurs
where note > x  -- ayant un note supérieure à X

Donc de (P), tu récupères aussi la note de ton utilisateur nommé N, d'accord ?

Imaginons que tu utilises cette note comme variable X de (S)... Alors, tu vas avoir le nombre d'utilisateurs ayant une meilleure note que N. appelons ce nombre 'nb'.

Donc de nb, tu déduis facilement la position 'p' dans le classement de ton utilisateur N. Si nb=0, alors personne est meilleur, il est premier. si nb = 2, il est troisième... bref, p = nb +1 !

Donc, pour récupérer le p de N en même temps que ces autres champs, on modifie un peu (P) :
select *, nb+1 as p
from utilisateur
where nom=N

Tu suis ?
Appelons cette nouvelle requête P1(N,nb).

Donc P1(N) contient une variable nb. Cette variable est donnée par la requête (S), je fais brutalement du remplacement de variable :
select *, S(X) + 1 as p
from utilisateur
where nom=N

ok ?  là c'est P2(N,X)... qui retourne l'utilisateur avec sa position...

Alors que vaut X ? ben, c'est la note de l'utilisateur qu'on est en train de séléctionner...
Ainsi :
select *, S(note) + 1 as p

from utilisateur

where nom=N

Là j'ai Pp(N), où, par le simple paramètre N, la fonction (requête) me retourne l'utilisateur et sa position.

Bon, par la suite... il faut aider un petit MySQL est donner des noms aux deux tables utilisateurs afin que la mécanique sache comment faire (dans "note > note"... C'est la note de qui ?)

donc je nomme la table de (P) 'u' et celle de (S) 't' ... complètement arbitraire...
ainsi : "t.note > u.note" devient compréhensible. Non ?
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
Salut,

Tu lis pas la doc de MySQL ? Y'a des trucs intéressants comme la clause WHERE qui te permet de limiter les résultats en fonction d'un critère...
Par exemple :

// Admettons que
$user_name = 'OmbreNoir';

$sql = 'SELECT * FROM users WHERE user_name=\'' . $user_name . '\';';

Enfin je comprensd pas bien bien ce que tu veux exactement, vu qu'en plus tu te mélanges dans le vocabulaire.

Si tu as 10 000 tables dans ta base de données, faut peut-être penser à utiliser un serveur rien que pour ça, voire même des clusters, et Oracle serait plus adapté que MySQL.
Je pense que tu parlais plutôt d'enregistrements. La table, dans l'exemple que tu donnes, c'est 'users', les enregistrements, les membres. 10000 membres, oui, c'est mieux.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Salut,


Je crois qu'il ne veut former un tableau de score ordonné de ces utilisateurs (ça sens le jeu en ligne), mais n'afficher que la parti pertinente pour l'utilisateur actuellement connecté...

C'est à dire les trois directement meilleurs et les trois directement moins bons... Ainsi l'utilisateur suit ça progression dans le classement au fur et mesure des rechargements.

Si c'est ça... honnêtement, fais le en PHP. Ca ne va pas te coûter tant de temps que ça, surtout si tu n'as pas 10000 utilisateurs...
Messages postés
67
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
10 juin 2011

Ok je vais tenter de m'expliquer mieu désolé.
Sur mon site, sur chacune des pages la personne vois ses informations dans un rectangle à gauche:
____________________
Inforamtion de OmbreNoir
Note: 4/10
Position: 2304/15000
Membre depuis: 15 jours.
---------------------------

La position de OmbreNoir ici, si je fais ma commande que je vous ai montré plus haut sa va lui donner la bonne position. Mais (J_G) je mets une variables à 10 000 membres pour être sûr que si un jour le site arrive à 10 000 membres que le site étais préparer pour sa, personnelement sa serais possible que sa arrive. Mais bon donc si je fais faire une requête SQL à toute les pages, pour tout le monde sur une boucle de 10 000 fois (tout dépend de sa position) mais si il est 9 987 sa va faire la boucle 9 987 fois ... pour chaque personne du site (Si il a 1000 personnes de connecter en même temp, la boucle va se faire +/- 10 000 fois sur 1000 membres­... je risque de faire tout sauté )

J'avais pensé qu'il existait peut-être un moyen de retourner la position de la personne avec une commande direct exemple... mysql_num_rows($sql);  sa retourne la position (Je donne sa comme exemple je sais que sa pas rapport mais bon)
Si non comment pourrais-je faire?
Messages postés
67
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
10 juin 2011

Hmm ok .. je comprends pas tout à fait la commande.. peux-tu me l'expliquer svp pour que je puisse m'en servir je dois la comprendre et savoir comment m'en servir :)

Merci à toi
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
avec qques confusion de nommage... (P), P1(N)... c'est ça ;)
Messages postés
67
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
10 juin 2011

Ok je comprends sa semble être bon mais
Comment je retourne..
$sql = 'select u.*, ( (select count(t.id) from utilisateurs as t where t.note > u.note ) + 1 ) as position from utilisateurs as u where u.nom='OmbreNoir'';
echo $sql;

?

Merci énormément pour l'expliquation si clair sa m'aide vraiment!
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Je suis très surpris par ta question....

Tu faisais comment là ?

$db = mysql_connect('localhost', ''.$db_users.'', ''.$db_pass.'');
mysql_select_db($db_name, $db);
$var 'SELECT * FROM users ORDER BY note ASC';
$i = 0;
do {
$data = mysql_fetch_asssoc($var);

...

En plus, c'est complètement faux ton script, j'avais pas vu.
Va faire un tour sur www.php.net fonction mysql_query et regarde les exemples d'utilisation.

A+
Messages postés
67
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
10 juin 2011

Mon script marchais très bien mais aurais pris trop de jus du cpu je vais aller faire un tour pour retourner ta commande.

Merci encore de ton aide.