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 :

Aide pour jointure SQL


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Par défaut Aide pour jointure SQL
    Bonjour,

    J'ai 2 Tables :

    [Categories]
    Cat_Id
    Cat_Nom


    [Annonces]
    Ann_Id
    .....
    Ann_Categories
    Ann_Categories1
    Ann_Categories2

    Grâce à énormément d'aide de pas mal de personnes de ce forum, j'ai réussi à obtenir une requête qui me donne le total d'annonces par catégories pour le champs Ann_Categories.

    Et je voudrais en fait obtenir le total d'annonces par categories pour les 3 champs confondu(Ann_Categories, Ann_Categories1, Ann_Categories2)

    Voici le code pour 1 seul Champ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT C.Cat_Id, C.Cat_Nom, COUNT(*) AS Total_annonce 
    FROM Categories C
    LEFT JOIN Annonces A ON A.Ann_Categories = C.Cat_Id 
    GROUP BY C.Cat_Id, C.Cat_nom
    ORDER BY Total_annonce DESC
    J'ai testé cela mais bien évidement cela m'affiche un total érroné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT C.Cat_Id, C.Cat_Nom, COUNT(*) AS Total_annonce 
    FROM Categories C
    LEFT JOIN Annonces A ON A.Ann_Categories = C.Cat_Id
    LEFT JOIN Annonces A1 ON A1.Ann_Categories1 = C.Cat_Id 
    LEFT JOIN Annonces A2 ON A2.Ann_Categories2 = C.Cat_Id  
    GROUP BY C.Cat_Id, C.Cat_nom
    ORDER BY Total_annonce DESC
    Une petit idée ? car je ne suis vraiment pas doué

  2. #2
    jnore
    Invité(e)
    Par défaut
    Bonsoir,

    Essaie ceci:

    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
    20
    21
    22
    23
     
    SELECT Cat_Id,Cat_Nom,Count(Ann_Categories) AS Total_annonce
    FROM Categories JOIN
    (
    	SELECT Ann_Categories
    	FROM Annonces
    	WHERE Ann_Categories IS NOT NULL
     
    	UNION ALL
     
    	SELECT Ann_Categories1
    	FROM Annonces
    	WHERE Ann_Categories1 IS NOT NULL
     
    	UNION ALL
     
    	SELECT Ann_Categories2
    	FROM Annonces
    	WHERE Ann_Categories2 IS NOT NULL
    ) sous_requete
    ON Categories.Cat_Id=sous_requete.Ann_Categories
    GROUP BY Cat_Id,Cat_Nom
    ORDER BY Count(Ann_Categories) DESC
    Je n'ai pas de quoi vérifier si c'est ok.
    Dis nous si c'est bon

  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
    22 039
    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 : 22 039
    Billets dans le blog
    6
    Par défaut
    Votre table ne repsctant pas les formes normales et notamment la première (repétiton des catégories) vos requêtes seront toujours :
    1) difficile à écrire
    2) totalement contre performantes

    Commencez par rectifier votre modèle afin de normaliser vos catégories...

    Petite question : que se passera t-il s'il faut une 4e catégorie ?

    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 averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Par défaut
    Bonjour,
    jnore ta requete me renvoi des résultats érronés (mais qui ce rapproche du nombre d'annonces réels)

    SQLPRO Vous parlez de normaliser mes categories. Auriez vous un modèle de tables afin de régulariser tout cela ?
    Si il faut une 4e Categories, je serais obligé d'ajouter un champs Ann_categories3 dans ma table Annonces.

  5. #5
    jnore
    Invité(e)
    Par défaut
    Pour la requete que je t'ai proposée, dis nous en un peu plus, qu'est-ce qui ne va pas? Donne-nous quelques données, ce sera plus aisé!

    Concernant les propos de SQLPro, l'idéal aurait été d'avoir un seul champ "Catégories" dans la table "Annonce" . Ce champ reprenant l'identité (id ou clé unique )"Cat_id" de ta table "Catégories".

    L'intéret d'une base de données est de mettre des champs en relation de façon définitive.
    Une requete dépend de bcp des liaisons. Si, sous pretexte que tu veux rajouter une catégorie, t'es obligé de modifier ta requete, cela veut dire que tes tables sont mal conçues.
    L'ajout de données se faisant en ligne et non pas en colonnes.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Par défaut
    Bonjour,

    En fait on sais mal compris, mes tables sont comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    [Categories]
    Cat_Id
    Cat_Nom
     
    [Annonces]
    Ann_Id
    ....
    Ann_Categories
    Ann_Categories1
    Ann_Categories2
    Ann_Categories3
    Les champs
    Ann_Categories, Ann_Categories1, Ann_Categories2, Ann_Categories3 reprennent bien l'Id de Cat_Id.
    Il y a quatre champs dans ma table [Annonces] pour qu'une annonce déposée puisse avoir plusieurs catégories.

    Exemple d'une ligne annonce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Ann_Id	Ann_Nom	Ann_Categories	Ann_Categories1	Ann_Categories2	
     
     
    1	    DURAND		1	           5	                     34

    Ensuite pour ta requête :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    SELECT Cat_Id,Cat_Nom,Count(Ann_Categories) AS Total_annonce
    FROM Categories JOIN
    (
    	SELECT Ann_Categories
    	FROM Annonces
    	WHERE Ann_Categories IS NOT NULL AND Ann_Valide='true'
     
    	UNION ALL
     
    	SELECT Ann_Categories1
    	FROM Annonces
    	WHERE Ann_Categories1 IS NOT NULL AND Ann_Valide='true'
     
    	UNION ALL
     
    	SELECT Ann_Categories2
    	FROM Annonces
    	WHERE Ann_Categories2 IS NOT NULL AND Ann_Valide='true'
     
    	UNION ALL
     
    	SELECT Ann_Categories3
    	FROM Annonces
    	WHERE Ann_Categories3 IS NOT NULL AND Ann_Valide='true'
    ) sous_requete
    ON Categories.Cat_Id=sous_requete.Ann_Categories
    GROUP BY Cat_Id,Cat_Nom
    ORDER BY Count(Ann_Categories) DESC
    par exemple pour la categorie 1, la requête me renvoi le résultat :
    255 annonces

    Alors quand utilisant cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT * FROM [Annonces] 
    LEFT JOIN Categories C ON Annonces.Ann_Categories = C.Cat_Id 
    LEFT JOIN Categories C1 ON Annonces.Ann_Categories1 = C1.Cat_Id 
    LEFT JOIN Categories C2 ON Annonces.Ann_Categories2 = C2.Cat_Id
     LEFT JOIN Categories C3 ON Annonces.Ann_Categories3 = C3.Cat_Id 
    WHERE ([Ann_Valide] = 'true' 
    AND ([Ann_Categories] = 1 
    OR [Ann_Categories1] = 1 
    OR [Ann_Categories2] = 1  
    OR [Ann_Categories3] = 1))
    cela me renvoi un tableau contenant 250 annonces.

    PS : dans ma dernière requete la jointure me sert simplement à afficher le champ Cat_Nom plutôt que l'id de la catégorie.


    Merci de votre aide !

  7. #7
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Pourquoi ne pas adopter un modèle logique comme celui ci :


    Categories(idCat, nomCat);
    Annonces(idAnn, ...);
    Appartenir(#idCat+#idAnn);
    Dans ce cas la requete deviens beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
         nomCat AS NOM,
         COUNT(*) AS NOMBRE
    FROM
         Categories AS Cat
    INNER JOIN
         Appartenir AS App ON
              Cat.idCat=App.idCat
    GROUP BY
         Cat.idCat

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Par défaut
    Bonjour,

    Je pense en effet que je vais adopter ton modèle, cela devient tout dessuite plus simple !


    Merci à vous tous !!!

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

Discussions similaires

  1. Besoin aide pour Requete SQL
    Par mystik11 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/07/2006, 11h34
  2. Besoin d'aide pour requête SQL
    Par vallica dans le forum Requêtes
    Réponses: 10
    Dernier message: 08/06/2006, 23h16
  3. [OGS ?] Demande d'aide pour requete SQL
    Par hamtary dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/03/2006, 12h58
  4. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39

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