jipe32
Messages postés277Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention11 mai 2010
-
25 juin 2006 à 17:41
coockiesch
Messages postés2268Date d'inscriptionmercredi 27 novembre 2002StatutMembreDernière intervention13 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
coockiesch
Messages postés2268Date d'inscriptionmercredi 27 novembre 2002StatutMembreDernière intervention13 septembre 20134 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???"
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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...
cs_Alx2
Messages postés32Date d'inscriptionmercredi 7 janvier 2004StatutMembreDernière intervention23 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.
cs_Alx2
Messages postés32Date d'inscriptionmercredi 7 janvier 2004StatutMembreDernière intervention23 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
coockiesch
Messages postés2268Date d'inscriptionmercredi 27 novembre 2002StatutMembreDernière intervention13 septembre 20134 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???"