sortie de select aleatoire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : sortie de select aleatoire

par beve » 14 juin 2005, 20:50

excuse moi voici la solution que j'ai choisi

et ça marche nickel
SELECT `commune` FROM `villes_france` ORDER BY RAND()

par mere-teresa » 14 juin 2005, 09:54

En fait, le random doit être fait en PHP, non ?
Tu mets toutes tes colonnes ordonnables (par un order by) dans un tableau. Et tu demandes un rand sur les index de ton tableau et c'est cette colonne qui va être choisie...

Au fait, ce topic est [Résolu] ? Mais quelle a été la solution choisie ?

par sadeq » 14 juin 2005, 09:42

En fait je retire ce que j'ai dit à propos du fonctionnement de rand() dans la clause ORDER BY sous Mysql, pour la simple raison que ce rand() ne désigne pas un n° de colonne existante dans le select puisqu'il génére un nombre flottant entre entre 0.0 et 1.0
Mais en testant la requête :
SELECT *, rand() as hasard FROM table ORDER BY hasard
Je m'apperçois qu'elle fonctionne exactement comme : ORDER BY rand()

Ce qui veut dire qu'un champ temporaire est créé par rand() à la fin de la génération du SELECT pour appliquer le classement final du fichier et rendre le resultat.
Je rappelle que ORDER BY force dans certains cas nécéssaires la création d'un fichier temporaire d'indexation dans le repertoire tmp/ avec l'extension .MYI

par Cyrano » 13 juin 2005, 16:38

Bon, alors supposons que je modifie comme ceci:

Code : Tout sélectionner

SELECT `commune` FROM `villes_france` ORDER BY RAND(25) LIMIT 0,20;
Là, j'aurai une liste aléatoire, mais toujours la même liste à chaque exécution.
RAND() , RAND(N)

Retourne un nombre aléatoire à virgule flottante compris dans l'intervalle 0 - 1.0. Si l'argument entier N est spécifié, il est utilisé comme initialisation du générateur de nombres aléatoires.
RAND() doit utiliser un algorithme bien précis et le fait d'ajouter un paramètre numérique fixera la sortie.

En conclusion, ORDER BY RAND() n'est intéressant si on veut de l'aléatoire basique que sans paramètre.

par mere-teresa » 13 juin 2005, 16:13

Ben je comprends pas ce que fait MySQL quand tu lui demandes ORDER BY .025

par Cyrano » 13 juin 2005, 15:43

Mais là, tu lui demandes par exemple :
SELECT commune FROM villes_france ORDER BY 3.25
Que fait-il alors ?
Résultat:
38958 rows fetched in 0,8027s (0,0046s)
Et j'ai en fait toutes les communes dans l'ordre alphabétique... j'avoue qu'un truc m'échappe dans ton interrogation mere-teresa :-k

par beve » 13 juin 2005, 14:43

merci c'est exactement ça que je cherchais
je ne connaissais pas du tout

merci beaucoup a vous

par zeus » 13 juin 2005, 14:09

Je te fait confiance Albat

Je disais juste "s'il est possible" car dans la doc, on ne peut utiliser cette syntaxe que a partir de MySQL 3.23
As-tu essayé au moins?
J'ai vraiment l'impression qu'on tourne en rond

Je m'explique

Dans la doc, j'ai lu qu'on ne pouvait utiliser cette syntaxe que à partir de MySQL 3.23. N'ayant pas testé cette syntaxe et partant du fait que tant qu'il reste des serveurs MySQL < 3.23, je n'accepte pas cette syntaxe sans réflechir. d'où le "s'il est possible"

J'espère avoir réussi à éclaircir ma déclaration

par mere-teresa » 13 juin 2005, 14:07

Rectification, c'est faux ce truc sur une seule colonne: je viens de tester avec une base de codes postaux où j'ai toutes les communes de France: j'ai fait ceci:

Code : Tout sélectionner

SELECT `commune` FROM `villes_france` ORDER BY RAND() LIMIT 0,20;
J'exécute plusieurs fois de suite et je n'ai jamais deux fois la même série: sur plus de 30000 entrées, il y a 20 noms de commune pris au hasard...
Mais là, tu lui demandes par exemple :
SELECT commune FROM villes_france ORDER BY 3.25
Que fait-il alors ?

par Cyrano » 13 juin 2005, 13:18

Rectification, c'est faux ce truc sur une seule colonne: je viens de tester avec une base de codes postaux où j'ai toutes les communes de France: j'ai fait ceci:

Code : Tout sélectionner

SELECT `commune` FROM `villes_france` ORDER BY RAND() LIMIT 0,20;
J'exécute plusieurs fois de suite et je n'ai jamais deux fois la même série: sur plus de 30000 entrées, il y a 20 noms de commune pris au hasard...

par Cyrano » 13 juin 2005, 13:14

Ça je dois avouer que je ne le savais pas non plus et en fait, ce n'est pas aussi clair dans le manuel... :-k Faut que je teste...

par naholyr » 13 juin 2005, 12:58

Et pourquoi ça ne serait pas possible ?
En fait c'est logique de faire un ORDER BY RAND() : car SQL peut faire le tri par n° de colonne et RAND() ici lui fournit un n° de colonne par hasard, le SELECT retourne alors le même lot de données trié à chaque fois selon une de ses colonne : Ce qui donne des résultats organisés au hasard.
Mais ça ne va pas marcher si le lot reourné contient seulement une colonne.
'vache ! Je viens enfin de comprendre ce qui se cachait derrière cette fichue syntaxe !
Je note :)

par sadeq » 13 juin 2005, 12:54

Et pourquoi ça ne serait pas possible ?
En fait c'est logique de faire un ORDER BY RAND() : car SQL peut faire le tri par n° de colonne et RAND() ici lui fournit un n° de colonne par hasard, le SELECT retourne alors le même lot de données trié à chaque fois selon une de ses colonnes : Ce qui donne des résultats organisés au hasard.
Mais ça ne va pas marcher si le lot retourné contient seulement une colonne.

par mere-teresa » 13 juin 2005, 11:28

Je te fait confiance Albat

Je disais juste "s'il est possible" car dans la doc, on ne peut utiliser cette syntaxe que a partir de MySQL 3.23
As-tu essayé au moins?

par zeus » 13 juin 2005, 11:28

Depuis que je fait de l'informatique, je part toujours du fait que tant que ce n'est pas impossible, c'est possible

Ca me pose parfois de gros problème mais ça m'aide souvent