bien le bonjour,
je voudrais extraire d'une table, des enregistrements aléatoires, un par type de produits
(pour la page d'accueil de notre dernier site)
bref j'ai donc un champ 'type' dans la table
un distinct sur le type ne me retournera que les != type, sans aucune autre colonnes,
j'ai donc cherché du coté de group by,
select * from fairepartmariage group by fairepartmariage.type order by rand();
me retourne tout le temps les même, classé aléatoirement,
le mieux que j'ai trouvé est
select * from fairepartmariage where rand(NOW()) group by fairepartmariage.type;
que j'ai testé en désespoir de cause et qui me sort 90% du temps les même entrées pour chaque type
vais je être obligé de me taper une requête par type de produit ?
et la le mec il le pécho par le bras et il lui dit '
Nil Le 24/02/2010 à 11:58 C'est quoi comme base de donnée ? Et tu peux mettre des variables dans la requête (via un script PHP ou autre) ? Ou c'est du SQL pur ?
c'est une base mysql, et le site est en php :^)
et la le mec il le pécho par le bras et il lui dit '
Nil Le 24/02/2010 à 12:23 Ok...
Alors mettons que tu veuilles récupérer 5 enregistrements...
- tu récupères le nombre d'enregistrement dans ta table (avec un SELECT COUNT (myindex) FROM mytable) que tu mets dans $myMax
$x = rand(1, $mymax-5);
Après, tu fais un select * from fairepartmariage group by fairepartmariage.type LIMIT $x, $x+5 order by rand();
Et normalement ça doit être pas loin de ce que tu cherches (pas testé, fait à l'arrache ^^)
nope :/
il y à 8 types différents, donc avec le group by ca retourne tout le temps 8 enregistrements
le limit m'en retournera juste une partie
select * from fairepartmariage group by fairepartmariage.type order by rand() limit 3,11;m'en retourne 5
ta solution ma tout de même donné une idée, mettre une sélection par plages avec un where id>$start and id<$end
mais forcement, il me faut une occurrence de chaque type de produit et il y en à qui commence à 1000 (sur 1200 entrées) ... donc non plus
je n'ai pas envi d'éclater en une requête par type de produits, ni d'extraire style 500 enregistrement et faire ma sélection coté php
c'est pour la page d'accueil, lire toute la base boufferais trop de ressources, et puis je me dit qu'il doit y avoir une manière simple
et la le mec il le pécho par le bras et il lui dit '
Nil Le 24/02/2010 à 14:21 Et si tu fais ton order by rand() avant le group by ?
RHJPP Le 24/02/2010 à 14:37 Il faudrait un truc comme ça en fait (attention, ce n'est pas très propre, on devrait pouvoir faire mieux) :
SELECT * FROM (SELECT * FROM `fairepartmariage` ORDER BY rand()) AS tab GROUP BY `type`;
[CROSS/]