VEF Blog

Titre du blog : mon blog tro bi1 !(pour etre jeune)
Auteur : GaNdAlF
Date de création : 22-11-2004
 
posté le 10-05-2005 à 16:32:03

soucis mysql ^^

comme ca faisait longtemps que j'avais pas eut de soucis avec mon site, il fallait bien que ca arrive (oui, j'ai une notion assez pessimiste de l'occurence des imponderables ^^)

donc : mon but est de selectionner au hasard dans une table qui sera au final assez grande une ligne, et de l'afficher ...

pour l'instant, je fais un
$result=mysql_query("SELECT * FROM trucs");
$num=mysql_numrows($result);
$i=rand(0,$num);

et ensuite, j'hesite a faire un mysql_result($result,$i,"astuce");
ou un $result=mysql_query("SELECT * FROM trucs WHERE numero=$i");

mais tout ca me semble assez barbare ...
n'y aurait il pas une autre solution ???
 

Commentaires

g6k le 11-05-2005 à 19:10:31
lol non ms c'est vrai quoi attends, franchement les gens de nos jours qui se croient tout permis! pffff Mexicain
elo le 11-05-2005 à 19:08:46
grave, à ta place je l'aurai mal pris!!! lo
g6k le 11-05-2005 à 07:44:18
bon légo tu arrêtes de me paraphraser un peu Langue Clin doeil
legolas le 11-05-2005 à 00:42:04
Access, c'est réputé être une base de donnée ? le monde a bien changé alors ... ;p
trève de blagues, déjà pour connaitre le nombre de lignes dans une table le mieux (et le plus rapide) est de faire :
select cound(id) from table; (à condition bien sûr que la colonne id est là, ce qui est le cas pour toutes mes tables), ou sinon au moins sous mysql :
select count(*) from table; mais vous verrez par la suite que on en a peut-être pas besoin.
La méthode where numero=$i, elle ne marche que si tu es sûr que il y a tous les $i entiers entre 1 et $num dans ta table, ce qui n'est pas le cas d'un auto_increment quand tu effaces des lignes par la suite. Ca veut dire qu'il faut créer une colonne spéciale dans ta base pour ca, et la gérer à chaque création/effacement de ligne.
Je ne vois pas en quoi cette méthode en deux temps pourrait être intéressante, sauf si la requete pour trouver une ligne aléatoire a lieu très souvent, et celles pour créer/effacer une ligne très rarement. Et encore.
Bon, j'arrete de vous faire baver, voici la formul magique qui conviendra à ton cas, à utiliser sans modération jusqu'à au moins 100 000 entrées : sur la table des commentaires de vefblog, avec 13 000 entrées, la requete ne prend que 0.06s la premiere fois et 0.02s les suivantes ( avec la mise en cache de la mémoire)
tadam voici la formule magique :
select * from trucs order by rand() limit 1
maintenant, si le nombre d'entrées se compte plutot en millions, je ne sais pas trop ce serait intéressnt de demander à un expert ou sur les forums spécialisés. Je pense qu'une solution serait de créer une table temporaire avec la meme formule mais un limit de l'ordre de 1000 par exemple, avec des id à prendre dans l'ordre jusqu'à épuisement de cette table. ce qui est une manière de tricher.
Marielle le 10-05-2005 à 19:52:36
Sinon, à vue d'oeil, ça me semble correct, mais je choisirai plutôt le :
$result=mysql_query("SELECT * FROM trucs WHERE numero=$i"); à la fin.
En même temps, je ne fais que des requêtes SQL sous Access en TP de BD, on ne fait pas de page en PHP, donc je ne connais pas toutes les commandes PHP. :(
Marielle le 10-05-2005 à 19:45:18
J'te ferai ça en TP de SQL demain matin. Clin doeil
kkuette le 10-05-2005 à 19:19:00
alors si l'on prend en compte d'une part qu'il fait assez beau dehors, mais d'autre part qu'il y a une petite brise tout de même, la seule solution que j'aurai à te proposer serait de vite éteindre ton ordinateur, prendre une ptite veste et aller te rafraichir les idées dehors, en profitant de ce beau soleil Joint bah quoi ce n'est pas une bonne théorie?
bon et bien ds ce cas il ne te reste plus K attendre super légo, et ses théories surement plus approfondies que les miennes qui ne servent à rien Langue
elo le 10-05-2005 à 19:08:14
si... arrêter de dmander à papa légo de faire tes devoirs Langue Langue Langue Langue Sourire lol