Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/06/2011, 16h40   #1
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 117
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 117
Points : 33
Points : 33
Par défaut Récupérer n éléments aléatoires de chaque catégorie

Bonjour,

Mon problème semble assez simple : Je cherche simplement à récupérer trois élément aléatoire de chaque catégorie.

Ma table "activites" est sous la forme

J'ai essayé de bidouiller http://www.developpez.net/forums/d10...nts-categorie/
Mais impossible d'avoir toutes les catégorie lorsque j'introduis des rand() dans la formule.

Je suis complètement bloqué, ça fait presque une journée que j'essaie de la réaliser.
Il faut savoir que ce sera une requête appelé assez souvent .
La table des activites contient environ 100 000 enregistrements

Pour l'instant j'émule la requête sous forme de script php avec des tables mais je pense que ça sera carrément plus performant en en faisant une vue.

Merci d'avance pour toutes vos suggestions !

cdt
ithurts est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 17h01   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 005
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 005
Points : 18 275
Points : 18 275
Envoyer un message via MSN à CinePhil
Une idée vite fait...

1) Création d'une table temporaire avec un id auto-incrémenté et les colonnes de la table activités que tu souhaites.

2) Alimentation de cette table avec les activités triées aléatoirement 3) Indexation de la table temporaire

4) Exécution de la requête des n premiers par catégories sur la table temporaire.

Avec 100 000 lignes, cela ne devrait pas durer trop longtemps si tu exécutes tout ça dans une seule transaction ou carrément dans une fonction SQL.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 10h29   #3
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 117
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 117
Points : 33
Points : 33
Bonjour !
C'est à peu près ce que je faisais en php et ça prenait un peu de temps (je ne sais pas pourquoi)

Dans mon cas je suis amené à faire un pivot après sur l'id_category (je dois mettre trois activité devant chaque id_category)
Du coup je pense avoir trouvé une solution un peu bancale :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT * 
FROM (SELECT id_category,
             (SELECT id FROM activites a2 WHERE a2.id_category = a1.id_category ORDER BY rand() LIMIT 1) AS id_c1,
             (SELECT id FROM activites a2 WHERE a2.id_category = a1.id_category ORDER BY rand() LIMIT 1 offset 1) AS id_c2,
             (SELECT id FROM activites a2 WHERE a2.id_category = a1.id_category ORDER BY rand() LIMIT 1 offset 2) AS id_c3
         FROM activites a1
         GROUP BY a1.id_category) t
WHERE id_c1 <> id_c2 AND id_c3 <> id_c1 AND id_c2 <> id_c3
Je ne sais pas si j'ai de la perte mais bon.
La requête est quasi instantanée et je peux en faire des vues !
Qu'en pensez vous ?

Bien cordialement
ithurts est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h07.


 
 
 
 
Partenaires

Hébergement Web