Choix aleatoire mysql


hm19000
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 492
Inscription: 2 Oct 2005

Choix aleatoire mysql

Message le Mer Sep 12, 2007 1:25

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.


yazerty
WRInaute passionné
WRInaute passionné
 
Messages: 1682
Inscription: 19 Juin 2005

Message le Mer Sep 12, 2007 3:40

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é ;).
Dernière édition par yazerty le Mer Sep 12, 2007 7:09, édité 1 fois.


biscuit
WRInaute impliqué
WRInaute impliqué
 
Messages: 519
Inscription: 5 Juin 2006

Message le Mer Sep 12, 2007 6:47

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


hm19000
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 492
Inscription: 2 Oct 2005

Message le Mer Sep 12, 2007 14:15

sa n'as pas marché, est que qlq 'un peut m'aider


bertimus
WRInaute passionné
WRInaute passionné
 
Messages: 2228
Inscription: 24 Aoû 2005

Message le Mer Sep 12, 2007 16:11

Tu peux tenter ça :
$sql = mysql_query("select * from table order by md5(rand()) limit 1");


Vu ici : http://www.webrankinfo.com/forums/topic ... 130_15.htm


Leonick
WRInaute accro
WRInaute accro
 
Messages: 18812
Inscription: 8 Aoû 2004

Message le Mer Sep 12, 2007 16:34

sauf que son problème est de les sélectionner dans les 20 derniers.

boutdepapier
WRInaute discret
WRInaute discret
 
Messages: 163
Inscription: 4 Aoû 2006

Message le Mer Sep 12, 2007 16:45

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";


Leonick
WRInaute accro
WRInaute accro
 
Messages: 18812
Inscription: 8 Aoû 2004

Message le Mer Sep 12, 2007 17:02

boutdepapier a écrit:$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: Tout sélectionner
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:


hm19000
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 492
Inscription: 2 Oct 2005

Message le Mer Sep 12, 2007 18:20

Toujours rien, je ne sais pas pourquoi ca passe pas.

Pourtant la solution de Leonick me parait juste. :cry:


biscuit
WRInaute impliqué
WRInaute impliqué
 
Messages: 519
Inscription: 5 Juin 2006

Message le Mer Sep 12, 2007 18:27

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: Tout sélectionner
   $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'];
   }


Leonick
WRInaute accro
WRInaute accro
 
Messages: 18812
Inscription: 8 Aoû 2004

Message le Mer Sep 12, 2007 21:24

biscuit a écrit:qui dit en passant est la même que la mienne...
:oops: ben oui, même pas fait gaffe.
biscuit a écrit: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:


hm19000
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 492
Inscription: 2 Oct 2005

Message le Mer Sep 12, 2007 22:40

Ca serai pas trop lourd pour le serveur ?

biscuit a écrit: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: Tout sélectionner
   $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'];
   }


biscuit
WRInaute impliqué
WRInaute impliqué
 
Messages: 519
Inscription: 5 Juin 2006

Message le Jeu Sep 13, 2007 6:17

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.


DrDroopy
WRInaute discret
WRInaute discret
 
Messages: 245
Inscription: 28 Nov 2005

Message le Jeu Sep 13, 2007 7:57

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 ?


Leonick
WRInaute accro
WRInaute accro
 
Messages: 18812
Inscription: 8 Aoû 2004

Message le Jeu Sep 13, 2007 8:42

DrDroopy a écrit: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.

Choix aleatoire mysql

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité