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 :

Problème de GROUP BY


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 45
    Points
    45
    Par défaut Problème de GROUP BY
    Bonjour,

    J'ai quelques soucis la clause GROUP BY dans ma requête sous MySQL. En effet cette dernière semble occulter certains enregistrements ou alors j'ai compris un truc de travers. Mon but est donc de grouper tous mes titres et d'avoir le premier sous titre correspondant.

    Voici ma requête sans GROUP BY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT article_id, a.titre, a.texte, ss_titre, lieu_id,d.date1, d.date2 
    FROM RENSEIGNEMENTS r, DATES d, ARTICLES a 
    WHERE r.date_id = d.id 
    AND a.id = r.article_id 
    AND (a.edition = 'NANCY' OR a.edition = 'NANCY-METZ' OR a.edition = 'NANCY-METZ-STRASB' OR a.edition = 'NANCY-METZ-STR-DIJON' OR a. edition = 'TTES EDITIONS') 
    AND a.rubrique = 'MANIFESTATIONS' 
    ORDER BY date1
    Elle me retourne ceci (je n'affiche pas tous les enregistrements bien sûr) :



    Maintenant avec un GROUP BY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT article_id, a.titre, a.texte, ss_titre, lieu_id,d.date1, d.date2 
    FROM RENSEIGNEMENTS r, DATES d, ARTICLES a 
    WHERE r.date_id = d.id 
    AND a.id = r.article_id 
    AND (a.edition = 'NANCY' OR a.edition = 'NANCY-METZ' OR a.edition = 'NANCY-METZ-STRASB' OR a.edition = 'NANCY-METZ-STR-DIJON' OR a. edition = 'TTES EDITIONS') 
    AND a.rubrique = 'MANIFESTATIONS' 
    GROUP BY a.titre
    ORDER BY date1
    Elle me retourne :



    Vous notez donc que dans le cas des articles ayant plusieurs sous titres, les premiers sous titres n'apparaissent pas.
    L'article des 750 ans de Pont à mousson par exemple : avec un GROUP BY il devrait avoir comme sous titre "Les actes fondateurs [...]" et non "Sons et lumières". De plus le mois de la date devrait être 05 etc... La requête n'est pas censé prendre le premier enregistrement pour compléter les autres colonnes après un GROUP BY ?

    Si vous pouviez m'éclairer sur mon problème, merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Dans la norme SQL, toutes les colonnes renvoyées qui ne font pas l'objet d'une fonction d'aggrégation doivent être dans la clause GROUP-BY, ce qui n'est pas le cas dans ta requête.
    Comment le moteur de la base sait-il quelle valeur garder pour les colonnes article_id, a.texte, ss_titre, lieu_id,d.date1, d.date2 ?

    Tatayo.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Il faudrait déjà utiliser la notation des jonctions qui suivent la norme actuelle (en fait depuis 1992 de mémoire).

    c'est à dire INNER JOIN ....

    ensuite il faudrait regarder dans les tutoriels les regroupements

    là vous confondez avec le DISTINCT
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Citation Envoyé par Shinosha Voir le message
    Mon but est donc de grouper tous mes titres et d'avoir le premier sous titre correspondant.
    Le premier... par rapport à quoi ?
    De quelle table les colonnes article_id, ss_titre et lieu_id proviennent-elles ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 45
    Points
    45
    Par défaut
    Le premier... par rapport à quoi ?
    De quelle table les colonnes article_id, ss_titre et lieu_id proviennent-elles ?
    Par rapport à sa date1 en fait. Je veux en fait le premier sous titre et les premières dates pour chaque titre, et avoir tous les titres une seule fois. J'espère que j'ai réussi à me faire comprendre
    Désolé j'ai zappé des alias :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.titre, r.article_id , a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2 
    FROM ARTICLES a INNER JOIN RENSEIGNEMENTS r ON a.id = r.article_id
    INNER JOIN DATES d ON r.date_id = d.id 
    WHERE (a.edition = 'NANCY' OR a.edition = 'NANCY-METZ' OR a.edition = 'NANCY-METZ-STRASB' OR a.edition = 'NANCY-METZ-STR-DIJON' OR a. edition = 'TTES EDITIONS') 
    AND a.rubrique = 'MANIFESTATIONS' 
    GROUP BY a.titre
    ORDER BY date1
    Il faudrait déjà utiliser la notation des jonctions qui suivent la norme actuelle (en fait depuis 1992 de mémoire) [...] là vous confondez avec le DISTINCT
    Corrigé pour les jointures, merci.
    C'est ce que je me suis dit au début mais Distinct n'a absolument aucun impact sur la requête.

    Dans la norme SQL, toutes les colonnes renvoyées qui ne font pas l'objet d'une fonction d'aggrégation doivent être dans la clause GROUP-BY, ce qui n'est pas le cas dans ta requête.
    Je ne suis pas sûr de comprendre, vous voulez dire qu'il faut que je mette toutes les colonnes (excepté celle par laquelle je veux grouper) dans la clause GROUP BY ?

  6. #6
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Bonjour,

    D'après ce que je comprend pour votre cas , après l'utilisation du group by vous voulez avoir la ligne ' Les 750...' en titre et ' Les actes fondateur ... ' en sous titre. Je ne pense pas que le group by soit la solution.

    Je pense qu'il faudrait faire un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT article_id, a.titre, a.texte, ss_titre, lieu_id,d.date1, d.date2 
    FROM RENSEIGNEMENTS r, DATES d, ARTICLES a 
    WHERE r.date_id = d.id 
    AND a.id = r.article_id 
    AND (A.EDITION = 'NANCY' OR A.EDITION = 'NANCY-METZ' OR A.EDITION = 'NANCY-METZ-STRASB' OR A.EDITION = 'NANCY-METZ-STR-DIJON' OR A. EDITION = 'TTES EDITIONS') 
    AND A.RUBRIQUE = 'MANIFESTATIONS' 
    AND D.DATE1=(SELECT MIN(D1.DATE1) FROM RENSEIGNEMENTS R1, DATES D1, ARTICLES A1 
    WHERE R1.DATE_ID = D1.ID 
    AND A1.ID = R1.ARTICLE_ID 
    where a1.titre=a.titre)
    (dsl pas tester la requete j'ai pas les table)

    En claire ça va prendre le titre/sous titre ayant la date1 la plus petite.

    Si cela ne te va pas dans les sous titre alors il faudrait peut être numéroté des Ss titre

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 45
    Points
    45
    Par défaut
    A vrai dire cela fait exactement ce que je voulais, merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2
    FROM ARTICLES a
    INNER JOIN RENSEIGNEMENTS r ON a.id = r.article_id
    INNER JOIN DATES d ON r.date_id = d.id
    WHERE (
    a.edition = 'NANCY'
    OR a.edition = 'NANCY-METZ'
    OR a.edition = 'NANCY-METZ-STRASB'
    OR a.edition = 'NANCY-METZ-STR-DIJON'
    OR a.edition = 'TTES EDITIONS'
    )
    AND a.rubrique = 'MANIFESTATIONS'
    AND d.date1 = ( 
    SELECT MIN( d1.date1 ) 
    FROM ARTICLES a1
    INNER JOIN RENSEIGNEMENTS r1 ON a1.id = r1.article_id
    INNER JOIN DATES d1 ON r1.date_id = d1.id
    WHERE a1.titre = a.titre ) 
    ORDER BY d.date1
    Cela dit, c'est vraiment la seule façon de faire ? La requête est quand même imposante. Surtout que je vous ai montré que la partie défectueuse de l'UNION ALL

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Tu peux déjà remplacer tous les OR par un IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHERE (
    a.edition = 'NANCY'
    OR a.edition = 'NANCY-METZ'
    OR a.edition = 'NANCY-METZ-STRASB'
    OR a.edition = 'NANCY-METZ-STR-DIJON'
    OR a.edition = 'TTES EDITIONS'
    )
    équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Sinon, une autre solution, si tu as la possibilité, c'est d'ajouter une colonne dans la table ARTICLES, genre is_master, avec un flag Y/N. Cette colonne correspondra à la premier page que tu veux.

    Au final ta requête donne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2
    FROM ARTICLES a
    INNER JOIN RENSEIGNEMENTS r ON a.id = r.article_id
    INNER JOIN DATES D ON R.DATE_ID = D.ID
    WHERE A.EDITION IN ('NANCY','NANCY-METZ','NANCY-METZ-STRASB','NANCY-METZ-STR-DIJON','TTES EDITIONS')
    AND A.RUBRIQUE = 'MANIFESTATIONS'
    and A.is_master='Y' 
    ORDER BY d.date1

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 45
    Points
    45
    Par défaut
    Malheureusement j'ai pas le droit

    Bref, merci pour votre aide.

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

Discussions similaires

  1. [XI] problème avec groupe sur un champ trié par origine ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 11/04/2007, 15h31
  2. Problème avec GROUP BY
    Par Korskarn dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/03/2006, 14h35
  3. Problème avec group by...
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/07/2005, 09h34
  4. [débutant] problème avec Group by
    Par Amenofis dans le forum Débuter
    Réponses: 5
    Dernier message: 25/05/2005, 09h57
  5. Réponses: 9
    Dernier message: 17/01/2004, 10h51

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