Membre au hasard dans la BDD

jipe32 Messages postés 277 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 11 mai 2010 - 25 juin 2006 à 17:41
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 - 26 juin 2006 à 14:51
Bonjour,
je voudrais savoir si on pouvait lancer une recherche au hasard dans une BDD pour faire ressortir un membre au hasard. Sinon, peut on lancer un script pour faire perdre les points d'un membre pris au hasard avec une raison quelquonque (prise d'une BDD) à une heure au hasard.
Je sais que ce n'est pas très clair.
Je pensais à Webcron, mais il ne fait ps le hasard je pense
Jipe32

Venez chasser les vampires, cliquez ici: www.bitefight.fr

7 réponses

coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
25 juin 2006 à 22:29
Salut!
SELECT id, pseudo FROM membres ORDER BY RAND() LIMIT 0, 1

Tu peux coupler ça avec Cron...

@++

R@f

www.allpotes.ch: Photos, humour, vidéos, gags, ...
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
0
cs_Alx2 Messages postés 32 Date d'inscription mercredi 7 janvier 2004 Statut Membre Dernière intervention 23 novembre 2006
26 juin 2006 à 09:16
La requête SQL proposée par coockieesch v te renvoyer la liste des membres classés par id ou par pseudo, selon le résultat de RAND().


Je pense plutôt que ce que tu cherches à faire se traduit par :

$rq = 'SELECT id, pseudo FROM membres';

$rs = mysql_query($rq);

$nb = mysql_num_rows($rs);

$alea = rand($nb);

$id_aleatoire = mysql_result($rs, $alea, 'id');


Effectivement, tu peux coupler ça avec un cronjob, pour sélectionner un membre au hasard à intervalle régulier.


Pour ta deuxième question, désolé, mais je ne comprends pas ce que tu veux faire...

Jésus sauvegarde, mais seul Bouddha fait des sauvegardes incrémentielles
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 juin 2006 à 09:35
Hello,

non non, la requête de coockiesch est la bonne. Elle ira bien chercher un membre, au hasard, dans la table, en ramenant son id et son pseudo.
La requête d'Alx2 a un problème : elle va chercher TOUTE la table, compte le nombre d'entrées récupérées, tire au hasard un nombre entre 0 et le nombre d'entrées total, et ressort de la requête précédente un id se trouvant sur la ligne correspondante au noimbre aléatoire.
Ca fait beaucoup pour tirer au hasard un membre...
0
cs_Alx2 Messages postés 32 Date d'inscription mercredi 7 janvier 2004 Statut Membre Dernière intervention 23 novembre 2006
26 juin 2006 à 09:51
Je ne voudrais pas insister (surtout que je ne pense pas faire le poids face à malalam...), mais dans la première requête, le caractère aléatoire porte sur le critère de tri (ORDER BY RAND()). En d'autres termes, elle peut se traduire de deux manières, selon le résultat de RAND :

SELECT id, pseudo FROM membres ORDER BY 1 LIMIT 0,1

ou

SELECT id, pseudo FROM membres ORDER BY 2 LIMIT 0,1
(et encore, je pense plutôt qu'elle renverra ORBER BY 0 ou ORDER BY 1...)


Il est exact que ma méthode est un peu lourde. On peut lui préférer ceci :

$rsnb = mysql_query('COUNT(id) FROM membres');

$nb = mysql_result($rsnb,0,0);
$rq SELECT id, pseudo FROM membres WHERE id RAND('.$nb.')';

(La première requête se justifie par le fait qu'il faut passer un paramètre à RAND si on veut obtenir un nombre supérieur à 1)


...ou alors, c'est que je n'ai rien compris à l'utilisation de la clause ORDER BY...

Jésus sauvegarde, mais seul Bouddha fait des sauvegardes incrémentielles
0

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

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 juin 2006 à 10:25
Alx2 => On reprend :-)
A ne pas faire, mais c'est pour l'exemple :
SELECT * FROM table
-> va chercher toutes les colonnes de toutes les lignes de la table 'table'.
SELECT * FROM table LIMIT 1
-> va chercher 1 ligne et toutes ses colonnes. Sans ORDER BY, cela va chercher la 1ère ligne rencontrée, donc la 1ère enregistrée dans la table.
SELECT id, pseudo ORDER BY pseudo
-> ve chercher toutes les lignes et leurs colonnes (champs) id et pseudo, et trier le résultat par pseudo.
Bref...SELECT travaille sur des lignes. Et ces lignes sont "numérotées grâce à un pointeur interne (c'est pour ça qu'on a aussi des row_seek et compagnie, d'ailleurs).

Maintenant, que va faire cette requête :
SELECT id, pseudo FROM table ORDER BY RAND()
Elle va aller chercher toutes les lignes de manière aléatoire (la 10 d'abord, puis la 4, puis la 124, puis...etc), et leurs champs id et pseudo, de la table 'table'.
SELECT sélectionne une ligne...et si on le lui demande, affine la sélection sur des champs...mais on bosse sur des lignes.
Donc, SELECT id, pseudo FROM table ORDER BY RAND() LIMIT 1
-> va aller chercher 1 ligne (LIMIT 1), avec ses champs id pseudo (SELECT id, pseudo), dans la table 'table', et ce, au hasard...au hasard, parce que SELECT...sélectionne une ligne (et des champs de CETTE ligne), et que ORDER BY RAND() trie aléatoirement ces lignes.
Si tu veux, le ORDER BY RAND() va fonctionner avant le SELECT.

Vlà vlà, je ne sais pas si j'ai été assez clair.
http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html
0
cs_Alx2 Messages postés 32 Date d'inscription mercredi 7 janvier 2004 Statut Membre Dernière intervention 23 novembre 2006
26 juin 2006 à 10:34
Tout s'éclaire !!!


Au temps pour moi, donc : je ne connaissais pas l'instruction "ORDER BY RAND()", que j'avais bêtement décomposée en "ORDER BY" et "RAND()", ce qui ne me paraissait pas cohérent (voir mon message précédent).


Mea culpa, donc, et merci à cookiesch pour m'avoir appris quelque chose (et à malalam pour me l'avoir expliqué).


Je vous laisse : j'ai plein d'optimisations à faire avec ma nouvelle fonction ! ^^

Jésus sauvegarde, mais seul Bouddha fait des sauvegardes incrémentielles
0
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
26 juin 2006 à 14:51
Comme il a l'air fort, ce malalam! :-P :-D

www.allpotes.ch: Photos, humour, vidéos, gags, ...
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
0
Rejoignez-nous