IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Récupérer n éléments aléatoires de chaque catégorie


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    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

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/04/2012, 18h18
  2. [AC-2007] Renvoyer les n éléments de chaque catégorie
    Par triaguae dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 19/04/2010, 14h28
  3. Renvoyer les n éléments de chaque catégorie
    Par triaguae dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/04/2010, 22h07
  4. Réponses: 3
    Dernier message: 07/03/2010, 20h50
  5. Récupérer les dernier articles de chaque catégories
    Par bobic dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/12/2008, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo