1

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 '

2

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 ?
avatar

3

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 '

4

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 ^^)
avatar

5

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 '

6

Et si tu fais ton order by rand() avant le group by ?
avatar

7

je vais tester ^^
edit : nope, mysql ne veut pas de select * from fairepartmariage order by rand() group by fairepartmariage.type;

néanmoins, après m'être inspiré de ce threadmariage f group by f.type;
 ca à l'air de fonctionnerselect f.id,f.type,
(select fpm.ref from fairepartmariage fpm where fpm.type = f.type order by rand() limit 1)
from fairepart
et la le mec il le pécho par le bras et il lui dit '

8

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/]
avatar

9

ton cross ma été utile Thepro, pour le AS

love.png
love merci bien :^)
et la le mec il le pécho par le bras et il lui dit '

10

Je ne sais pas si ce que tu fais est plus rapide, mais ma façon est plus courte et plus simple à comprendre grin
avatar

11

ah oui, effectivement ! oui

SELECT * FROM (SELECT * FROM admin_multimedia.fairepartmariage ORDER BY rand()) AS tab GROUP BY type;marche nikel

la j'avais besoin d'extraire d'autre valeur de la ligne choisie au hazard, et etais reduit a essayer des truc du style :
SELECT f.type,
(SELECT ref FROM admin_multimedia.fairepartmariage fpm WHERE fpm.type=f.type ORDER BY rand() LIMIT 1) AS ref,
(SELECT fournisseur FROM admin_multimedia.fairepartmariage fpm WHERE fpm.ref=ref LIMIT 1) AS fournisseur,
(SELECT collection FROM admin_multimedia.fairepartmariage fpm WHERE fpm.ref=ref LIMIT 1) AS collection,
FROM admin_multimedia.fairepartmariage f GROUP BY f.type LIMIT 8;
qui bien évidemment ne fonctionnais pas ^^

merci beaucoup !
et la le mec il le pécho par le bras et il lui dit '