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

Langage SQL Discussion :

Sélectionner n premiers éléments mais pour chaque catégorie


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Points : 65
    Points
    65
    Par défaut Sélectionner n premiers éléments mais pour chaque catégorie
    Bonjour
    Savez-vous si c'est possible de faire une requête en SQL qui fasse ce que je fais avec des boucles en PHP :

    - Requête qui récupère toutes les catégories
    - Boucle foreach pour toutes les catégories
    - De nouveau une requète à chaque tour du foreach pour récupérer les trois premiers articles de chaque catégorie.


    Il faudrait que ma requete SQL fasse une limit mais pour chaque catégorie, ce que j'arrive à faire c'est comme ci-dessous ne me donne bien sûr que trois articles au lieu de 3 par catégorie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT a.id_articles, c.id_categorie FROM articles AS a
    INNER JOIN categories AS c
    ON a.id_categorie = c.id_categorie
    LIMIT 3
    Merci d'avance si vous voyez une piste ou peut être que ce n'est tout simplement pas possible.

    Edit : je précise que cette ressource souvent mis en exemple sur le web ne me donne pas le résultat voulu : http://mysql.developpez.com/telechar...aque-categorie

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    Non la réponse est bien sur ce fameux lien, c'est bien cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT e.id_element, e.nom_element, e.id_categorie
    FROM ELEMENT e
    WHERE (
    SELECT COUNT(*)
    FROM ELEMENT e1
    WHERE e1.id_categorie = e.id_categorie
    AND e1.id_element < e.id_element
    ) < n
    Mais je n'arrive pas à comprendre comment elle marche, par exemple si le count(*) donne 9 éléments (il y aurait donc 10 éléments de cette catégorie) lorsque on regarde le dixième, que fait la requête ?
    On lui dit donc "Where 9 < n", et alors, c'est dingue ce truc comment elle remmène les trois derniers éléments rien qu'avec ça?

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Plus performant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH T_3_ARTICLE_CATEGORIE AS
    (
    SELECT a.id_articles, c.id_categorie, 
           ROW_NUMBER() OVER(PARTITION BY c.id_categorie 
                             ORDER     BY a.id_articles) AS N
    FROM   articles AS a
           INNER JOIN categories AS c
                 ON a.id_categorie = c.id_categorie
    )
    SELECT articles, id_categorie
    FROM   T_3_ARTICLE_CATEGORIE *
    WHERE N <= 3;
    A lire sur les fonction de fenêtrage et d'ordonnancement : http://sqlpro.developpez.com/article...clause-window/

    A lire sur les CTE : http://sqlpro.developpez.com/cours/s...te-recursives/

    Évidemment si vous êtes sur ce pseudo SGBDR qu'est mySQL, ça va être dur !!! A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    Merci (oui Mysql).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CS3] mettre pub pour chaque catégorie
    Par doudou01 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 21/09/2009, 09h45
  2. position médiane pour chaque catégorie
    Par freestyler dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/06/2008, 16h36
  3. [SQL] calcul pour chaque catégorie le nombre d'entités
    Par salmoucha dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/04/2008, 15h28
  4. Sélectionner la dernière date entrée pour chaque enregistrement
    Par Cindy m dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/07/2007, 15h11
  5. Sélectionner le premier élément d'une ComboBox
    Par deubal dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/11/2005, 10h32

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