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 :

Nombre de clé étrangere pointant sur une clé primaire avec les 0


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 80
    Points : 46
    Points
    46
    Par défaut Nombre de clé étrangere pointant sur une clé primaire avec les 0
    Bonjour,
    j'ai un petit souci bête qui me pose problème si quelqu'un peut m'aider s'il vous plait.

    j'ai une table Livre et commentaire, chaque livre a un certain nombre de commentaire ou aucun, ce que je dois faire c'est afficher l'id du livre ainsi que le nombre de commentaire associé (ça c'est facile) mais là ou je bloque c'est que je dois aussi afficher les livres qui n'ont aucun commentaire en gros si j'ai un premier livre "a" qui a 2 commentaire et un 2ème livre "b" qui a aucun commentaire je dois afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    livre    nbCommentaire
    a               2
    b               0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select idLivre,count(*)
    from Livre
    Join commentaire on idLivre = livre
    groupy by idLivre
    ici le souci c'est que je prend que les livres qui ont un commentaire

    maintenant si je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select idLivre,count(*)
    Left JOIN commentaire on idLivre = livre
    groupy by idLivre
    le probleme ici c'est qu'un livre qui a aucun commentaire sera afficher comme ayant un.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Il faut que tu comptes le nombre de commentaires et pas le nombre de lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  lvr.idLivre
        ,   COUNT(cmt.livre)
    FROM    Livre       AS  lvr
        LEFT JOIN 
            commentaire AS  cmt 
            ON  lvr.idLivre = cmt.livre
    GROUP BY lvr.idLivre
    Ainsi, seuls les cmt.livre non null seront comptés.

    PS : en prenant l'habitude de spécifier toutes les colonnes d'une requête par l'alias de leur table d'origine, tu simplifies la compréhension et la maintenabilité de la requête

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 80
    Points : 46
    Points
    46
    Par défaut
    merci pour ta réponse, donc un "count(null) renvoi 0" ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    En effet

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par wear12
    donc un "count(null) renvoi 0" ?
    Pas tout à fait...

    La requête de al1_24 signifie :
    Sélectionner les idLivre et le comptage des commentaires
    depuis la table livre jointe à gauche à la table des commentaires
    en groupant par idLivre.

    Si on fait simplement une jointure gauche sans le groupage (et sans le comptage, du coup mais simplement en affichant la colonne des commentaires), le SGBD va effectivement afficher des NULL dans la colonne des commentaires en face des livres qui n'ont aucun commentaire. Mais quand on fait un comptage, le SGBD compte effectivement combien il trouve de lignes associées dans la table de droite pour chaque ligne de la table de gauche. Pour un livre qui n'a pas de commentaire, le comptage vaut bel et bien zéro. Le SGBD ne compte pas les NULL.

    D'ailleurs, petite démonstration...

    Livre (idLivre, titre)
    1, '20 000 lieues sous les mers'
    2, 'Atlas Shrugged'
    3, 'Ainsi parlait Zarathoustra'
    4, 'Frankenstein'

    Commentaire (livre, texte)
    1, 'Souvenir d'enfance '
    4, 'Fantastique !'
    1, 'Jules Verne : un visionnaire !'

    Cherchons tous les commentaires de tous les livres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l.idLivre, l.titre, c.texte
    FROM Livre l
    LEFT OUTER JOIN Commentaire c ON c.livre = l.idLivre
    ORDER BY idLivre
    Résultat :
    1, '20 000 lieues sous les mers', 'Souvenir d'enfance '
    1, '20 000 lieues sous les mers', 'Jules Verne : un visionnaire !'
    2, 'Atlas Shrugged', NULL
    3, 'Ainsi parlait Zarathoustra', NULL
    4, 'Frankenstein', 'Fantastique !'

    Comptons maintenant les NULL dans le résultat de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT COUNT(*) AS nbNull
    FROM
    (
    	SELECT l.idLivre, l.titre, c.texte
    	FROM Livre l
    	LEFT OUTER JOIN Commentaire c ON c.livre = l.idLivre
    ) tmp
    WHERE texte IS NULL
    Résultat : 2

    => COUNT(NULL) ne vaut pas zéro !

    Au contraire ! Si une colonne contient des NULL (ce qui est une mauvaise chose !), un comptage des valeurs différentes de cette colonne donnera une ligne de résultat pour chaque NULL car NULL <> NULL pour un SGBD.

    Démonstration...
    Imaginons que vous ne connaissiez pas systématiquement l'auteur de chaque livre et que vous ayez autorisé pour cela le NULL dans la colonne auteur :
    Livre (idLivre, titre, auteur)
    1, '20 000 lieues sous les mers', 'Jules Verne'
    2, 'Atlas Shrugged', NULL
    3, 'Ainsi parlait Zarathoustra', NULL
    4, 'Frankenstein', 'Mary Shelley'
    5, 'Le tour du monde en 80 jours', 'Jules Verne'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT l.auteur, COUNT(*) as nbLivres
    FROM Livre l
    GROUP BY l.auteur
    Résultat (sous réserve de vérification mais c'est ce que ça devrait donner) :
    'Jules Verne', 2
    'Mary Shelley', 1
    NULL, 1
    NULL, 1

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Si, COUNT(NULL) vaut bien 0.

    Et s'il y a plusieurs lignes, toutes à NULL, un COUNT(LaColonneToujoursNULL) renverra 0 également

    Enfin, un GROUP BY regroupe bien les NULL.

    Donc si on a :

      A      B
    -------------
    NULL    NULL
    NULL     12
    
    La requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT A, COUNT(*), COUNT(B)
    FROM LaTable
    GROUP BY A
    renverra

      A    COUNT(*)    COUNT(b)
    -----------------------------
    NULL      2           1
    

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Au temps pour moi alors !
    Il me semblait avoir lu le contraire (il y a pas mal de temps il est vrai).

    Bon de toute manière NULL dans une table, c'est nul !

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

Discussions similaires

  1. Lien Hypertexte pointant sur une fonction Javascript
    Par Delphi-ne dans le forum ASP.NET
    Réponses: 6
    Dernier message: 10/07/2007, 16h00
  2. Réponses: 2
    Dernier message: 09/03/2007, 17h57
  3. Réponses: 4
    Dernier message: 14/11/2006, 19h03
  4. initialiser une struc pointant sur une struct
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 30/03/2006, 16h07
  5. Liste déroulante pointant sur une page
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/03/2005, 09h26

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