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 :

INNER JOIN sur un table si les données existent


Sujet :

Langage SQL

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut INNER JOIN sur un table si les données existent
    Bonjour,

    J'ai une table photos avec 2 colonnes id et views.
    J'ai une table comments avec 3 colonnes id_link, type_comment, comment

    J'aimerais récupérer le nombre de commentaires liées aux photos s'il y en a, mais pour le moment je ne récupère que les photos avec des commentaires, et non TOUTES les photos avec "0 commentaire".

    Voila ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.id, p.views, COUNT( * ) AS total_comments
    FROM comments c
    INNER JOIN photo_images p ON c.link_id_item = p.id
    WHERE c.comment_type =  'photo'
    GROUP BY c.link_id_item
    Comment faire pour retourner toutes les photos, avec un COUNT à 0.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 148
    Points : 1 414
    Points
    1 414
    Par défaut
    Il faut utiliser les jointures externes (même sujet que la discussion précédentes )

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Oui, j'ai testé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.id, p.views, COUNT( * ) AS total_comments
    FROM photo_images p
    LEFT OUTER JOIN comments c 
    ON c.link_id_item = p.id
    WHERE c.comment_type =  'photo'
    GROUP BY c.link_id_item
    ou un Mais rien à faire, il me retourne seulement les commentaires > 0

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 148
    Points : 1 414
    Points
    1 414
    Par défaut
    Normal :

    la clause WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE c.comment_type =  'photo'
    sélectionne après la jointure.

    Mets cette clause dans la jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.id, p.views, COUNT( * ) AS total_comments
    FROM photo_images p
       LEFT OUTER JOIN comments c 
       ON c.link_id_item = p.id AND c.comment_type =  'photo'
    GROUP BY c.link_id_item -- ???????
    ATTENTION AUX INFOS DU GROUP BY !!!!

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    C'est normal, car tu met une sélection dans le where, il vaut mieux la mettre dans la jointure.

    Démonstration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with ta as 
    (select 1 id, 'a' txt from dual union all
    select 2 id, 'b' txt from dual), 
    tb as 
    (select 1 id, 'toto' txt from dual)
    Si on retranscrit ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM ta
    LEFT OUTER JOIN tb
    on ta.id = tb.id
    where tb.txt = 'toto'
    On a :

    1 a 1 toto
    Alors que si tu passe la condition dans la jointure tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM ta
    LEFT OUTER JOIN tb
    on ta.id = tb.id
    and tb.txt = 'toto'
    Et là on a le bon résultat :

    1 a 1 toto
    2 b null null

  6. #6
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Niquel, merci beaucoup!
    Il faut que je m'améliore sur les LEFT RIGHT OUTER INNER JOIN et GROUP BY...

  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 : 61
    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
    Pour comprendre la raison de la solution qui t'a étée donnée, lire mon article sur le sujet.

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

Discussions similaires

  1. Select .. inner join sur plusieurs tables
    Par 3titi92 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/01/2015, 12h19
  2. [MySQL-5.5] Syntaxe INNER JOIN sur même table
    Par salent9 dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2014, 08h49
  3. inner join sur 3 Tables
    Par faressam dans le forum Développement
    Réponses: 3
    Dernier message: 22/04/2008, 14h23
  4. deux inner join sur une table
    Par the-player777 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/11/2007, 09h43
  5. 3 Inner Join sur la même table
    Par Zolex dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/05/2007, 12h32

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