Choix aleatoire mysql

WRInaute occasionnel
Bonjour,

Comment choisir aleatoirement 6 enrengisterment parmis les 20 derniers enrengistremement.

SELECT id FROM AAAA ORDER BY RAND() LIMIT 6 c'est ce que j'ai trouvé.


Merci pour votre aide.
 
WRInaute passionné
Je ne comprends pas : si tu as trouvé pourquoi poses-tu la question :- ?

Edit : ah ok pardon je n'avais pas compris l'histoire des 20 derniers enregistrements désolé ;).
 
WRInaute occasionnel
Quelque chose dans le genre ... sait pas si ça fonctionne:

SELECT id FROM table WHERE id IN (SELECT id FROM table ORDER BY id DESC LIMIT 20) ORDER BY RAND() LIMIT 6
 
WRInaute discret
Perso je fais :
$sql = "SELECT id, nom, chapo FROM fiche WHERE activite_actrice=1 ORDER BY rand() LIMIT 1";

Et ça marche trés bien ;) Si tu veux faire un random sur les deux derniers il faut jouer sur le limit :

$sql = "SELECT id, nom, chapo FROM fiche WHERE activite_actrice=1 ORDER BY rand() LIMIT (Le nombre total d'enreistrement total - 20),1";
 
WRInaute accro
boutdepapier a dit:
$sql = "SELECT id, nom, chapo FROM fiche WHERE activite_actrice=1 ORDER BY rand() LIMIT (Le nombre total d'enreistrement total - 20),1";
non, là ça trie par ordre aléatoire et ensuite ça en choisit les 20 derniers.
Alors que ce qu'il veut, c'est en prendre 5 au hasard dans les 20 derniers. En fait, il faudrait quelque chose comme ça
Code:
SELECT * FROM matable where id in (select id FROM matable  order by id desc limit 10)
order by rand() limit 0,5
mais avec ma version de mysql, le limit du (select...) ne passe pas. Erreur :cry:
 
WRInaute occasionnel
qui dit en passant est la même que la mienne...

Sinon tu fais un tableau multidimensions avec les 20 résultats de ta requête, tu mélange le tout aléatoirement, et tu prends les 6 premiers...

-edit:

un truc comme ça (pas testé) :
Code:
	$i = 0;
	while ($row = mysql_fetch_assoc($sql)) {
		$row[$i]['champs1'] = $row['champs1'];		
		$row[$i]['champs2'] = $row['champs2'];
		$row[$i++]['champs3'] = $row['champs3'];
	}
	mysql_free_result($sql);
	
	shuffle($row);
	
	for ($i=0;$i<6;$i++) {
		print $row[$i]['champs1'];		
		print $row[$i]['champs2'];		
		print $row[$i]['champs3'];
	}
 
WRInaute accro
biscuit a dit:
qui dit en passant est la même que la mienne...
:oops: ben oui, même pas fait gaffe.
biscuit a dit:
Sinon tu fais un tableau multidimensions avec les 20 résultats de ta requête, tu mélange le tout aléatoirement, et tu prends les 6 premiers...
Ca marche, car c'est ce que je fais dans ces cas là, mais ça m'aurais bien arrangé aussi d'avoir une solution directe en sql :cry:
 
WRInaute occasionnel
Ca serai pas trop lourd pour le serveur ?

biscuit a dit:
qui dit en passant est la même que la mienne...

Sinon tu fais un tableau multidimensions avec les 20 résultats de ta requête, tu mélange le tout aléatoirement, et tu prends les 6 premiers...

-edit:

un truc comme ça (pas testé) :
Code:
	$i = 0;
	while ($row = mysql_fetch_assoc($sql)) {
		$row[$i]['champs1'] = $row['champs1'];		
		$row[$i]['champs2'] = $row['champs2'];
		$row[$i++]['champs3'] = $row['champs3'];
	}
	mysql_free_result($sql);
	
	shuffle($row);
	
	for ($i=0;$i<6;$i++) {
		print $row[$i]['champs1'];		
		print $row[$i]['champs2'];		
		print $row[$i]['champs3'];
	}
 
WRInaute occasionnel
C'est peut-être pas super optimisé (quoique, je vois pas comment faire d'autre, si qq a une astuce je suis aussi preneur)... mais ça reste une toute petite boucle, je doute que cela soit ne serait-ce que visible sur les performance de ton serveur... J'utilise un peu près cette méthode pour faire une sorte de cache des requêtes sql pour lesquels je dois sortir des valeurs plusieurs fois sur la même page.
 
WRInaute discret
Lorsque l'on fait un SELECT "par defaut", sans indications supplémentaires, les données sont classées des plus anciennes aux plus récentes ?
 
WRInaute accro
DrDroopy a dit:
Lorsque l'on fait un SELECT "par defaut", sans indications supplémentaires, les données sont classées des plus anciennes aux plus récentes ?
presque, car quand on supprime un enregistrement, le suivant va prendre la place libérée. Sauf si on compacte la base, mais bon, on ne le fait pas à chaque suppression.
 
WRInaute accro
si tu trouve vraiment pas, tu prend les 20 derniers, tu les met dans un tableau php, et tu va chercher les resultats avec un rand() php :)
 
WRInaute discret
Leonick a dit:
presque, car quand on supprime un enregistrement, le suivant va prendre la place libérée.

Donc si on supprime un des 1ers enregistrements l'entrée suivante sera vu comme un ancien enregistrement. Et donc n'apparaitra pas dans les derniers ajouts. Comment faire, avec une table d'articles, pour connaitres les derniers ajout de manière fiable ? Rajouter un champ servant de compteur ?
 
WRInaute accro
DrDroopy a dit:
Comment faire, avec une table d'articles, pour connaitre les derniers ajout de manière fiable ? Rajouter un champ servant de compteur ?
un id en autoincrement en index unique évidemment
e-kiwi a dit:
si tu trouve vraiment pas, tu prend les 20 derniers, tu les met dans un tableau php, et tu va chercher les resultats avec un rand() php :)
c'est ce que Biscuit avait proposé et que j'utilise sans problème, vu qu'il ne semble pas y avoir de solution plus optimisée
 
WRInaute accro
DrDroopy a dit:
Leonick a dit:
un id en autoincrement en index unique évidemment
L'autoincrement ne va pas réattribuer un id qui a été supprimé
(Leonick sur tous les fronts :p)
non car la valeur max est conservée. Quand tu copies la structure d'une table, l'autoincrement est sauvé sos la forme AUTO_INCREMENT=valmax et donc, même si tu supprimes toutes les données, tu recommenceras à valmax et pas à 0
 
Discussions similaires
Haut