[MySQL] tirage aléatoire via ORDER BY rand()

Olivier Duffez (admin)
Membre du personnel
je souhaite tirer au sort un des records renvoyés par une requête MySQL
j'utilise le classique
Code:
ORDER BY RAND()
mais malheureusement les résultats semblent toujours affichés dans le même ordre, même si je relance la requête.

y a-t-il une histoire d'initialiation du random ?
ai-je raté un truc ?

merci...
 
WRInaute discret
Ben, moi je vois pas ce qui peut clocher, j'utilise le ORDER BY Rand() de cette façon.

Sauf que moi j'écris ORDER BY Rand(), ça a peut être une importance de mettre la majuscule en début et minuscules après.
 
Olivier Duffez (admin)
Membre du personnel
j'ai fait plusieurs tests et je n'ai toujours pas compris ce qui cloche : selon la complexité de la clause WHERE, l'ordre des résultats est aléatoire ou constant

donc effectivement troops, pour des requêtes comme ton exemple ça marche
mais pour une requête avec notamment 4 conditions (séparées par AND) ça ne marche pas (l'ordre est toujours le même)
 
WRInaute accro
tu veux dire qu'il affiche toujours la meme chose ? 8O
je viens de lancer ceci chez moi
Code:
SELECT champ1,champ2 from psn_maboutique_prod where active=1 and (cid=3 or cid=4) and prixsupp=0 and exposer=0 ORDER BY RAND() LIMIT 7

et ca me sort 7 élements différents a chaque fois.. la table fait 100 enregistrements.
 
Olivier Duffez (admin)
Membre du personnel
oui, toujours la meme chose...
j'ai résolu le pb en mettant rand() as hasard dans la liste des SELECT et en triant par ORDER BY hasard

bizarre
 
WRInaute passionné
WebRankInfo a dit:
oui, toujours la meme chose...
j'ai résolu le pb en mettant rand() as hasard dans la liste des SELECT et en triant par ORDER BY hasard

bizarre

curieux, parce que la doc dit exactement le contraire :?
 
WRInaute impliqué
Essaye qqchose comme ça peut-être (pas testé) :

Code:
("SELECT * FROM table ORDER BY rand(" . time() . " * " . time() . ") LIMIT 3");
 
WRInaute discret
WebRankInfo a dit:
je souhaite tirer au sort un des records renvoyés par une requête MySQL
j'utilise le classique
Code:
ORDER BY RAND()
mais malheureusement les résultats semblent toujours affichés dans le même ordre, même si je relance la requête.

y a-t-il une histoire d'initialiation du random ?
ai-je raté un truc ?

merci...

et bien pour moi, c'est normal

rand() renvoit un seul nombre

ca fait donc un truc style select * from table order by 0,5

la methode que tu as choisie apres, cad, celle de mettre un nombre rand différent pour chaque ligne est meilleure.

verifie bien que les rand sont différents d'un select à un autre ;-)
 
WRInaute discret
WebRankInfo a dit:
je souhaite tirer au sort un des records renvoyés par une requête MySQL
j'utilise le classique
Code:
ORDER BY RAND()
mais malheureusement les résultats semblent toujours affichés dans le même ordre, même si je relance la requête.

y a-t-il une histoire d'initialiation du random ?
ai-je raté un truc ?

merci...
J'arrive peut-être après la bataille mais comme je n'ai pas vue de vraie solution, je mets mon grain de sel.
J'utilisais cette fonction avec succès jusqu'à il y a peu de temps.
El local, elle marche parfaitement.
J'en suis arrivé à la conclusion qu'il s'agissait probablement d'un changement arrivé avec MySql 5.
J'ai cherché des infos (chez Nexen notamment) sans succès sur un eventuel changement de comportement... Peut-être faut-il ajouter un argument du style rand(n) ou rand(n1,n2)...
C'était histoire de relancer l'affaire si quelqu'un a trouvé the solution...
 
Nouveau WRInaute
Bonjour à tous, je pense que le () du rand correspond à la seed.

En fait il est impossible de modéliser l'aléatoire. Par définition on peut pas le faire, car cela est seulement réalisé par la nature, il faut donc fournir à votre fonction rand une graine pour qu'il puisse asseoir son processus pseudo aléatoire. La plupart du temps on prend la date ou l'heure...

Salutations
 
WRInaute impliqué
Bonjour,
je vous propose ma solution:
Code:
$sql = mysql_query("select * from table order by md5(rand()) limit 1");

Voilà! chez moi ca marche bien!
 
Discussions similaires
Haut