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

Requêtes MySQL Discussion :

[MySQL 4.1] Count sur jointure avec null


Sujet :

Requêtes MySQL

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut [MySQL 4.1] Count sur jointure avec null
    Bonjour,

    voilà, j'ai 3 tables, nature_evenement, type_evenement et modele_evenement. A une nature est associée 0..n type, et à un type est associé 0..n modele. Donc un modele correspond à un type, et donc à une nature.

    Je veux compter, pour chaque naturele nombre de modele_evenement existant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT nature_evenement.nom, count(*)
    FROM nature_evenement,model_evenement,type_evenement
    WHERE type_evenement.IdType_Evenement = model_evenement.Type_Evenement_IdType_Evenement
    AND type_evenement.nature_evenement_IdNature = nature_evenement.IdNature
    AND type_evenement.actif=1
    AND nature_evenement.actif=1
    AND model_evenement.actif=1
    GROUP BY nature_evenement.nom
    ORDER BY nature_evenement.nom ASC
    Le souci étant que les natures n'ayant pas de d'evenement n'apparaissent pas; Je suis donc parti sur une requete à jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT nature_evenement.nom, count(*)
    FROM nature_evenement,model_evenement
    LEFT OUTER JOIN type_evenement ON (type_evenement.IdType_Evenement = model_evenement.Type_Evenement_IdType_Evenement
    AND type_evenement.nature_evenement_IdNature = nature_evenement.IdNature
    AND type_evenement.actif=1)
    WHERE nature_evenement.actif=1
    AND model_evenement.actif=1
    GROUP BY nature_evenement.nom
    ORDER BY nature_evenement.nom ASC
    Avec cette requete, toutes mes natures s'affichent, mais elle ont chacune la meme quantité (ce qui est faux).


    Comment dois je corriger ces requetes ? Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Si je mets RIGHT à la place de LEFT, je retombe sur le resultat de la premiere requete, les nature possedant au moins un modele sont affichés, mais pas les autres :/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    salut,

    est ce que tu pourrais montrer la strcture de tes tables, et exemples de resultats (ce que tu obtiens et ce que tu aimerais avoir)?

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    table nature_evenement :
    - IdNature
    - Nom
    - actif

    table type_evenement :
    - IdType_Evenement
    - nom
    - nature_evenement_IdNature (FK sur nature_evenement.IdNature)
    - actif

    table model_evenement :
    - idModel_Evenement
    - nom
    - Type_Evenement_IdType_Evenement (FK sur type_evenement.IdType_Evenement)
    - actif

    j'ai sauté les attributs secondaires. Les champs actifs permettent de savoir si l'element a été effacé ou pas.

    Ce que je cherche :

    nom nature -- nombre de modeles d'evenements liés
    nature 1 -- 4
    nature 2 -- 1
    nature 3 -- 0

    Si je fais un LEFT OUTER JOIN, j'obtiens mes 3 lignes de nature, mais chacune a la valeur 5.

    Si je fais un JOIN/RIGHT JOIN, j'obtiens nature 1 => 4 et nature 2 => 1, mais pas de nature 3 à 0.


    Merci de votre aide.

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Bon, j'ai quelque chose, que je ne toruve pas propre, mais qui a le mérite de me renvoyer ce que je désire :

    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
    SELECT DISTINCT nature_evenement.nom, count(*) as 'Compteur'
    FROM model_evenement,nature_evenement
    JOIN type_evenement ON
        nature_evenement.IdNature = type_evenement.nature_evenement_IdNature
        AND model_evenement.Type_Evenement_IdType_Evenement = type_evenement.IdType_Evenement
    WHERE nature_evenement.actif=1
    AND model_evenement.actif=1
    GROUP BY nature_evenement.nom
    UNION
    SELECT DISTINCT nature_evenement.nom, 0 as Compteur
    FROM model_evenement,nature_evenement
    LEFT OUTER JOIN type_evenement ON
        (nature_evenement.IdNature = type_evenement.nature_evenement_IdNature
        AND type_evenement.IdType_Evenement IS NULL)
    WHERE nature_evenement.actif=1
    AND nature_evenement.nom NOT IN
      (
        SELECT DISTINCT nature_evenement.nom
        FROM model_evenement,nature_evenement
        JOIN type_evenement ON
            nature_evenement.IdNature = type_evenement.nature_evenement_IdNature
            AND model_evenement.Type_Evenement_IdType_Evenement = type_evenement.IdType_Evenement
            WHERE nature_evenement.actif=1
            AND model_evenement.actif=1
            GROUP BY nature_evenement.nom
      )
    GROUP BY nature_evenement.nom
    Explication : je selectionne les natures avec au moins 1 modele attaché, et je fais une union, composée de tous les modeles moins ceux que j'ai déjà trouvé (et donc étant à 0).


    Je ne trouve pas ca propre, ca me renvoie ce que je cherche, mais j'attends une reponse apportant une version plus simple/propre/efficace.

    Thanks

  6. #6
    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
    Bonsoir,

    Essaie avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select ne.nom, count(me.idModele_evenement)
    from nature_evenement ne
    left join type_evenement te on ne.IdNature = te.nature_evenement_IdNature and te.actif = 1
    left join modele_evenement me on te.idType_evenement = me.Type_Evenement_idType_Evenement and me.actif = 1
    where ne.actif = 1
    group by ne.nom
    Si j'ai bien compris ton problème, ça doit faire à peu près ce que tu cherches, sans trop se compliquer la vie
    Un bon conseil tout de même, à la lecture de tes différentes requêtes : passe à l'écriture des jointures selon le standard SQL2 (inner join, left join... on...). En effet, dans ton exemple, il est frappant que tu mélanges les deux écritures et ça devient très difficile de savoir ce qui correspond à la condition de jointure et à la clause where.
    Or, dans ce cas précis, on s'en sort en ajoutant une condition supplémentaire dans les jointures, ce que tu ne pouvais pas faire par une jointure dont la condition est dans le where (ou alors avec des parenthèses).
    Bref, je palabre , tout ça pour dire que le mieux, c'est de suivre le standard.
    Tu verras, le SQL devient plus facile.
    La simplicité de ma requête (si tant est qu'elle soit juste) par rapport à celle qui marche pour toi l'atteste, non ? Pas d'union, de subselect et j'en passe et des pires... Si c'est pas de l'optimisation, ça

    Bon courage,

    ced
    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

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Impec, j'obtiens ce que je veux.

    Je vais me mettre à jour sur les normes d'écriture SQL (j'ai pas l'habitude d'écrire les JOIN lol)

    Encore merci ^^

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

Discussions similaires

  1. Condtions sur jointures avec doctrine
    Par zakuza dans le forum Doctrine2
    Réponses: 3
    Dernier message: 14/07/2014, 12h32
  2. Jointure avec NULL
    Par bronon dans le forum Requêtes
    Réponses: 9
    Dernier message: 16/01/2014, 09h32
  3. [Doctrine] Count sur jointure
    Par Leward dans le forum ORM
    Réponses: 0
    Dernier message: 11/11/2011, 03h24
  4. count(*) sur jointure
    Par macadam75 dans le forum SQL
    Réponses: 6
    Dernier message: 17/08/2010, 20h02
  5. [SQL] Count sur jointure
    Par oim dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/01/2008, 16h18

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