Selection aleatoire sans doublon

Selection aleatoire sans doublon - PHP - Programmation

Marsh Posté le 22-11-2003 à 17:52:55    

voila mon pb:
j'ai besoin de selectionner aleatoirement dans une table un certain nb d'elements sans doublon.
 
j'ai programmer un petit script mais il n'est vraiment pas efficace puisque il me selectionne bien aleatoirement des elements de celle ci mais il sort des doublons puisque a chaque nouvelle selection il selectionne a nouveau dans la totalité de la table.
 
voici le code:

Code :
  1. $res = mysql_query("SELECT max(Id) AS max, min(Id) AS min FROM video_jour" );
  2. $array = mysql_fetch_array($res);
  3. $IdMax = $array["max"];
  4. $IdMin = $array["min"];
  5. mt_srand((float) microtime()*1000000); //initialisation de mt_rand
  6. $randval = mt_rand($IdMin,$IdMax);
  7. $i=1;
  8. while ($i<16)
  9. {
  10. $req_video = mysql_query("select * FROM video_jour WHERE id='$randval'" );
  11. $res_video = mysql_fetch_array($req_video);
  12. $video_jour  = $res_video["nom"];
  13. $video_taille = $res_video["taille"];
  14. $randval = mt_rand($IdMin,$IdMax);
  15. $nom_video_jour = ucfirst($video_jour);
  16. $pos_ = strpos($nom_video_jour,"_" );
  17. $nom_video_jour = substr($nom_video_jour,0,$pos_);


 
si quelq'un a une idée pour optimiser ca ou des conseils pour reecrire un nouveaux script...
merci

Reply

Marsh Posté le 22-11-2003 à 17:52:55   

Reply

Marsh Posté le 22-11-2003 à 18:33:43    

quand tu selectionnes un entrée tu stockes son id dans un tableau.
et tu compares toujours l'id de la nouvelle selection aux ids stockées dans la tableau.
 
--> si l'id de la selection courante est pas contenu dans le tableau je garde, sinon je jette......


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 22-11-2003 à 18:38:01    

simogeo a écrit :

quand tu selectionnes un entrée tu stockes son id dans un tableau.
et tu compares toujours l'id de la nouvelle selection aux ids stockées dans la tableau.
 
--> si l'id de la selection courante est pas contenu dans le tableau je garde, sinon je jette......
 


 
ouai, exactement ce que j'aurais fait aussi.
 
Edit : en même temps, imaginons qu'il cherche un nombre aléatoire de 1 à 100 par exemple... Quand il en sera à 90, ça risque d'être un peu long pour qu'il trouve les 10 derniers, vu que php continuera à prendre au hasard un nombre et qu'il sera rejeté... ça peut être lourd comme système dans certains cas.


Message édité par Hermes le Messager le 22-11-2003 à 18:39:59
Reply

Marsh Posté le 22-11-2003 à 19:08:47    

pour ton edit : on est d'accord ;)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 22-11-2003 à 19:24:24    

merci pour vais reponse, mais je me trouve en fait dans le cas de l'edit de Hermes le Messager.
 
Mais en fait la selection aleatoire a besoin de se faire uniquement une fois par jour: donc serait t'il possible de generer une page fixe a partir de la selection aleatoire(qui prendra donc du temps une seule fois par jour.)
merci

Reply

Marsh Posté le 22-11-2003 à 19:38:22    

Arnow a écrit :

merci pour vais reponse, mais je me trouve en fait dans le cas de l'edit de Hermes le Messager.
 
Mais en fait la selection aleatoire a besoin de se faire uniquement une fois par jour: donc serait t'il possible de generer une page fixe a partir de la selection aleatoire(qui prendra donc du temps une seule fois par jour.)
merci


 
Si le serveur est à toi oui, sinon non, ou alors en rusant (genre faire appel à un service web spécial (je me souviens plus du nom) ou encore faire en sorte que ton propre ordinateur se connecte au net une fois par jour à telle heure et fasse appel à la page de génération de ta table aléatoire).

Reply

Marsh Posté le 22-11-2003 à 19:55:01    

Arnow a écrit :

merci pour vais reponse, mais je me trouve en fait dans le cas de l'edit de Hermes le Messager.
 
Mais en fait la selection aleatoire a besoin de se faire uniquement une fois par jour: donc serait t'il possible de generer une page fixe a partir de la selection aleatoire(qui prendra donc du temps une seule fois par jour.)
merci


oui c'est possible tu mets une crontab en place et une tache que tu executes une fois par jour si c'est ton serveur comme le dis HLM sinon webcron.org
 
du reste, tu peux optimiser ton algo .. eventuellement tu concatens les id a ta requête pour les exlures de ton select  [:spamafote]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 23-11-2003 à 00:27:15    

ben pourquoi il ait pas un "order by rand(colone) limit 0,16 au lieu de faire 16 fois la même requête?
 
En plus, tel qu'il a fait son système, s'il a surprimé des lignes, il risque de sélectionner un id qui n'existe plus.

Reply

Marsh Posté le 23-11-2003 à 20:40:25    

Hermes le Messager a écrit :


 
Si le serveur est à toi oui, sinon non, ou alors en rusant (genre faire appel à un service web spécial (je me souviens plus du nom) ou encore faire en sorte que ton propre ordinateur se connecte au net une fois par jour à telle heure et fasse appel à la page de génération de ta table aléatoire).
 


 
y a webcron.org, ou un ptit log made in maximus :p
 
 
Sinon pour son prob, il dit utiliser une table si j'ai bien compris.
 
Pq ne pas mettre un champ booleen ( deja_tire ) dans la table qui est a zero tant qu'il a pas ete tiré.
 
Dans le script php on selectionne les donnée avec la fct RAND()
 
$req= "SELECT * FROM matable WHERE deja_tire=0 ORDER BY RAND() LIMIT 0,1";
 
et puis on update le champ a 1 :
 
req = "UPDATE matable SET deja_tire = 1 WHERE id=$id_tire";
 
 
rien de plus simple  [:spamafote]  
 
 
edit:  
 
Oops j'avais pas vu qui veut plusieurs enregistrements a la fois.
 
ben alors il met LIMIT 0, 16 comme dit lus haut.
 
et ensute dans le script on sauve tt les enregistrement qui ont été tirés dans un tableau et puis on update le tout a la fin.
 


Message édité par _maximus_ le 23-11-2003 à 20:42:33

---------------
Ptit con de goret je t'emmerde ^_^
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed