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 :

Requête complexe avec COUNT


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut Requête complexe avec COUNT
    Bonjour à tous,

    Je me perds dans une requête un peu complexe.

    J'ai 5 tables :
    1 table Categorie
    1 table Titre
    1 table MotsClés
    +
    1 table qui relie 1 titre à 1 Catégorie (1 catégorie peut regrouper plusieurs titres)
    +
    1 table qui relie 1 titre à 1 mots clés (1 mots clés peut avoir plusieurs titres, et 1 titre peut avoir plusieurs mots clés).

    Je souhaite récupérer dans ma requête la liste des mots clés présents dans chaque catégorie ET compter combien de fois chaque mot clé apparait.

    J'ai fait la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT D.id_motscles,D.nom 
    FROM titre C,titrecategorie T, categorie V, MotsClesCategorie K, MotsCles D 
    WHERE C.id_titre=T.id_titre 
    AND T.id_categorie=V.id_categorie 
    AND K.id_titre=C.id_titre 
    AND K.id_motscles=D.id_motscles 
    AND V.nom="Categorie1"
    Cela me retourne bien la liste des Mots clés de la catégorie 1.
    Par contre je voudrais pouvoir ajouter un count pour compter pour CHAQUE mot clé, combien de fois il est présent dans cette catégorie 1.

    Par exemple :
    1, MotClé1, 3(fois)
    2, MotClé2, 5(fois)
    5, MotClé5, 1(fois)

    Merci d'avance pour vos conseils.

    P.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Lisez ceci dans un premier lieu pour régulariser vos jointures :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    En particulier le chapitre III "Syntaxe normalisée des jointures"

    Ensuite concernant votre problème :
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/
    Et ca sera le 1er chapitre.

  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
    Et pourrais-je rajouter : le formatage de la requête .

    Cela rend sa lecture et donc sa correction tellement plus agréable
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Effectivement, je suis désolé.

    Je viens de reprendre la requête, cela fait donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT D.id_motscles,D.nom 
    FROM titre C JOIN titrecategorie T 
      ON C.id_titre=T.id_titre 
    JOIN categorie V 
     ON T.id_categorie=V.id_categorie 
    JOIN MotsClesCategorie K 
     ON K.id_titre=C.id_titre 
    JOIN MotsCles D 
     ON K.id_motscles=D.id_motscles
    WHERE V.nom="Categorie1"
    Je pense que les jointures sont plus propres là Désolé.

    Je pense ajouter GROUP BY K.id_motscles au niveau des tables
    puis faire un COUNT (C.id_titre) au niveau du select, mais cela ne marche pas.

    Qu'est-ce que je fais mal ?

    Merci de votre aide.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Quel con !
    En fait je mettais le GROUP BY au mauvais endroit !

    Donc la requête qui fonctionne fait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT D.id_motscles,D.nom, COUNT(C.id_titre) AS NOMBRE
    FROM titre C JOIN titrecategorie T 
      ON C.id_titre=T.id_titre 
    JOIN categorie V 
     ON T.id_categorie=V.id_categorie 
    JOIN MotsClesCategorie K 
     ON K.id_titre=C.id_titre 
    JOIN MotsCles D 
     ON K.id_motscles=D.id_motscles
    WHERE V.nom="Categorie1" GROUP BY K.id_motscles
    Et voilà le travail.
    Merci pour vos conseils.

    P.

  6. #6
    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
    attention, il manque un élément dans le GROUP BY
    ET ce n'est pas le bon élément

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT D.id_motscles,D.nom, COUNT(C.id_titre) AS NOMBRE
    FROM titre C JOIN titrecategorie T 
      ON C.id_titre=T.id_titre 
    JOIN categorie V 
     ON T.id_categorie=V.id_categorie 
    JOIN MotsClesCategorie K 
     ON K.id_titre=C.id_titre 
    JOIN MotsCles D 
     ON K.id_motscles=D.id_motscles
    WHERE V.nom="Categorie1" 
    GROUP BY D.id_motscles,D.nom
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Merci pour ces précisions.
    Par contre je ne comprends pas bien les modifs.
    Pourquoi ajouter le GROUP BY avec les 2 champs nom et id_keywords, plutôt qu'uniquement le id_keywords ?

    Merci d'avance.

  8. #8
    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
    Bonjour

    tu n'as pas bien lu le lien indiqué par Punkoff.

    Toutes les colonnes fournies dans le SELECT (sauf les colonnes indiquant une agrégation, le COUNT dans ton cas) doivent apparaitre dans le GROUP BY.


    Essayes, tu verras bien ce qui se passe sans cela
    Merci d'ajouter un sur les tags qui vous ont aidé

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Toutes les colonnes fournies dans le SELECT (sauf les colonnes indiquant une agrégation, le COUNT dans ton cas) doivent apparaitre dans le GROUP BY.
    Ceci tout simplement car sinon le SGBD va "penser" qu'il peut y avoir plusieurs nom pour un id_keywords.

    De ce fait il attendra une fonction qui permettra de gérer l’agrégation sur le nom (comme le max, count, etc ..).

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

Discussions similaires

  1. Requête complexe avec 14 tables
    Par Kawabaumga dans le forum Développement
    Réponses: 7
    Dernier message: 14/05/2010, 10h24
  2. Requête complexe avec plusieurs lignes par table
    Par Iwazaru dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/09/2009, 09h46
  3. Requète Complexe avec GROUP BY et classement descendant
    Par snoups58 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2008, 18h44
  4. requête erronée avec count (*)
    Par arcane dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/09/2008, 16h43
  5. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12

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