Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 13/07/2011, 17h29   #1
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
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 :
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.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h41   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h50   #3
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Et pourrais-je rajouter : le formatage de la requête .

Cela rend sa lecture et donc sa correction tellement plus agréable
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 20h11   #4
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Effectivement, je suis désolé.

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

Code :
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.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 20h21   #5
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Quel con !
En fait je mettais le GROUP BY au mauvais endroit !

Donc la requête qui fonctionne fait donc :
Code :
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.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 20h30   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
attention, il manque un élément dans le GROUP BY
ET ce n'est pas le bon élément

Code :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 22h06   #7
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
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.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 19h48   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 08h30   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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 ..).
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h12.


 
 
 
 
Partenaires

Hébergement Web