sortie de select aleatoire

Eléphanteau du PHP | 44 Messages

13 juin 2005, 09:46

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 :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

13 juin 2005, 09:49

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

13 juin 2005, 09:49

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 :)
Modifié en dernier par mere-teresa le 13 juin 2005, 10:19, modifié 1 fois.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

13 juin 2005, 09:50

Mais ça ne vas pas lui sélectionner toute la bdd ?

Et puis comment il peut assurer l'abscence de doublons ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 128 Messages

13 juin 2005, 09:51

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?
C'est pas moi qui ai volé l'orange !

Eléphanteau du PHP | 44 Messages

13 juin 2005, 09:53

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

Eléphant du PHP | 128 Messages

13 juin 2005, 10:00

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 :)
C'est pas moi qui ai volé l'orange !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

13 juin 2005, 10:02

Beve, tu n'étais pas loin... ;)
SELECT * FROM concours_lod_photo ORDER BY rand()

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

13 juin 2005, 10:04

Si ça existe ça, je suis dégouté...

Le temps que j'ai pu perdre avec ça ...
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 19672 Messages

13 juin 2005, 10:08

Code : Tout sélectionner

SELECT * FROM `table` ORDER BY RAND()
Voir ICI
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 128 Messages

13 juin 2005, 10:19

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 :D)

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

Code : Tout sélectionner

SELECT * FROM maTable WHERE monID = RAND(N)
Modifié en dernier par Guakamol le 13 juin 2005, 10:29, modifié 1 fois.
C'est pas moi qui ai volé l'orange !

Mammouth du PHP | 19672 Messages

13 juin 2005, 10:28

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

13 juin 2005, 10:42

J'aime quand on me lit :)
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 128 Messages

13 juin 2005, 10:55

huhu oui mais pour moi aussi c le matin :D
C'est pas moi qui ai volé l'orange !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 juin 2005, 11:02

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;
}
?>
Modifié en dernier par sadeq le 13 juin 2005, 11:14, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène