Page 1 sur 3
sortie de select aleatoire
Posté : 13 juin 2005, 09:46
par beve
bonjour
est ce possible d'avoir l'ordre de sortie des info d'un selec complétement aléatoire et sans doublon ?
genre
SELECT * FROM `concours_lod_photo` ORDER BY random
un truc comme ça
merci

Posté : 13 juin 2005, 09:49
par zeus
Je ne pense pas !!!
Select extrait par ordre d'enregistrement par défaut et si tu veut donner un attribut d'extraction, c'est toujours selon un ordre
Mais tu peut te débrouiller en PHP :
- extraction simple depuis la dbb
- tranfert d'un tableau
- génération d'un chiffre compris entre 0 et le nb de case de ton tableau -1
- vérification que ce chiffre n'est pas sorti
- affichage de la valeur correspondante
affichage aléatoire et sans doublons
Posté : 13 juin 2005, 09:49
par mere-teresa
Heu, ce serait pas plus simple de sélectionner ce que tu veux plutôt que étoile (tout) et de dire WHERE id LIKe RAND(N)
edit : Encore une fois, je réponds à moitié à côté de la plaque...mais bon, c'est lundi matin 
Posté : 13 juin 2005, 09:50
par zeus
Mais ça ne vas pas lui sélectionner toute la bdd ?
Et puis comment il peut assurer l'abscence de doublons ?
Posté : 13 juin 2005, 09:51
par Guakamol
Hum je dirai par ordre croissant sur la clé, mais ca depend peut etre du sgbd que tu utilise.
Mais si tu cherche vraiment a ordonner tes resultats pourquoi tu n'utilise pas une clause ORDER BY?
Posté : 13 juin 2005, 09:53
par beve
en fait je veux un ordre completement aléatoire et sans doublon.
toute la base doit etre inclus dans le RS...
perso je suis vraiment bloqué la
Posté : 13 juin 2005, 10:00
par Guakamol
Tu devrait peut etre faire le traitement independamment de ta requete
tu enregistre tes resultats dans un tableau, puis tu te code une ptite fonction random sur les indices de ce tablo (plus les test dont tu a besoin sur les valeurs) tu rempli ainsi au fur et a mesure un autre tableau qui lui te servira a l'affichage.
enfin bref c un peu ce que te propose de faire zeus

Posté : 13 juin 2005, 10:02
par albat
Beve, tu n'étais pas loin...
SELECT * FROM concours_lod_photo ORDER BY rand()
Posté : 13 juin 2005, 10:04
par zeus
Si ça existe ça, je suis dégouté...
Le temps que j'ai pu perdre avec ça ...
Posté : 13 juin 2005, 10:08
par Cyrano
Posté : 13 juin 2005, 10:19
par Guakamol
Hum :" RAND() n'est pas un générateur parfait de nombres aléatoires, mais reste une manière rapide de produire des nombres aléatoires portables selon les différentes plates-formes pour une même version de MySQL."
Je comprend pas tres bien, je vois pas comment ca trie les valeur aleatoirement (enfin si tu t'en ai deja servi et que ca marche je met surtout pas ta parole en doute hein

)
EDIT : Ok autant pour moi ca m'intriguer et je viens de saisir la ligne du dessus : dans un select le rand est evaalué pour chaque ligne

), mais alors la requete ne deviendrait elle pas
Posté : 13 juin 2005, 10:28
par Cyrano
Oui, c'est du reste bien mentionné dans le manuel, ce n'est pas la panacée, mais ça fonctionne. Ensuite pour éviter les doublons, il suffit de rajouter un DISTINCT sur le champ dont tu cherches une valeur unique et la question est réglée.
Posté : 13 juin 2005, 10:42
par mere-teresa
J'aime quand on me lit 
Posté : 13 juin 2005, 10:55
par Guakamol
huhu oui mais pour moi aussi c le matin

Posté : 13 juin 2005, 11:02
par sadeq
Voici un exemple de tirage d'un lot au hasard à partir d'une base.
L'idée est d'extraire tout le lot dans un tableau et puis le réorganiser par hasard.
<?
//Tirage au hasard à partir d'une base
$con = mysql_connect("localhost","root","") or die (mysql_errno().": ".mysql_error());
$table = mysql_db_query("test","select * from donnees",$con) or die (mysql_errno().": ".mysql_error());
while ($ligne = mysql_fetch_assoc($table)){if ($ligne != null) $source [] = $ligne;}
//Réorganisation de la source par hasard
$source = hasard($source);
//Affichage
if ($source != null)
foreach($source as $ligne){
echo "<p>";
if ($ligne != null)
foreach($ligne as $donnée)
echo "\t$donnée";
}
//Fonction de réorganisation d'un tableau par hasard
function hasard ($source){
$resultat = null;
$index = null;
for ($i=0; $i < count($source); $i++){
$suivant = false;
do {
$hasard = abs(rand(0,count($source)-1));
if ($hasard >=0 && $hasard < count($source) && !utilisé($hasard, $index)) {
//enregistrer la valeur trouvée
$resultat[] = $source[$hasard];
$index[] = $hasard;
$suivant = true;
}
} while (count($resultat) < count($source) && !$suivant);
}
return $resultat;
}
//Fonction qui cherche si un index est déjà utilisé
function utilisé($i,$index){
if ($index != null)
foreach ($index as $valeur)
if ($i == $valeur) return true;
return false;
}
?>