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

SQL Procédural MySQL Discussion :

Problème de jointure.. je pense.


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut Problème de jointure.. je pense.
    Mise en contexte rapide:
    J'ai une galerie d'image, et chaque image peut avoir ou non une mention. Comme il y a plusieurs mention, (dans ce cas-ci: 2) , je dois savoir SI il y en a AU MOINS 1 d'active pour chaque image.


    Bon, voici ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT i .* , m.img_small
    FROM 2g3p_j_galerie_image AS j
    LEFT JOIN 2g3p_image AS i ON ( i.id = j.id_image )
     
    LEFT JOIN 2g3p_j_mention_image AS jm ON ( jm.id_image = j.id_image )
    LEFT JOIN 2g3p_mention AS m ON ( m.id = jm.id_mention
     
    AND m.img_small =1 )
    WHERE j.id_galerie = '2'
    j'ai isolé 2 left join ensemble car c'est eux qui s'occupe de trouver le dernier champ qui me pose problème.

    Voici le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     id  |     no      | titre          | img_small |
    -------------------------------------------------
     7   | Img-007     | Test 7         | NULL      |
     8   | #004        | Clique Là!     | NULL      |
     9   | test        | bonhomme       | NULL      |
     10  | #0005       | Sexy           | NULL      |
     10  | #0005       | Sexy           | 1         |

    Si j'utilise un GROUP BY i.id , dans ce cas-ci, la requête va garder seulement la premiere ligne et supprimer le 1 de la deuxième.

    Des idées ?

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    A mon avis, tu as une erreur ici:

    LEFT JOIN 2g3p_mention AS m ON ( m.id = jm.id_mention

    AND m.img_small =1)
    Cette condition n'a rien a faire dans un LEFT JOIN et cela se passe en fait comme si tu faisais un produit cartésien, mais de manière implicite (ce qui peut être utile parfois, à condition de savoir l'utiliser...).

    Tu nous as dit que tu avais deux mentions dans ta table 2g3p_mention, le AND m.img_small =1 dans le LEFT JOIN produit donc le produit cartésien suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    m.id | m.img_small
    --------------------
      1  |     1
      2  |     1
    Et quand on fait le LEFT JOIN, ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jm.id_mention | m.id | m.img_small
    -----------------------------------
          2       | NULL |    NULL 
          2       |  2   |     1

    Ce qui me paraitrait plus correct, du point de vue du sens :

    LEFT JOIN 2g3p_mention AS m ON ( m.id = jm.id_mention)

    WHERE j.id_galerie = 2
    AND m.img_small =1
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    Ha, merci, je savais pas...

    Bon, j'ai changé ma requete pour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT i . * , m.img_small
    FROM 2g3p_j_galerie_image AS j
    LEFT JOIN 2g3p_image AS i ON ( i.id = j.id_image )
    LEFT JOIN 2g3p_j_mention_image AS jm ON ( jm.id_image = j.id_image )
    LEFT JOIN 2g3p_mention AS m ON (m.id = jm.id_mention )
     
    WHERE j.id_galerie = '2'
    GROUP BY i.id
    LIMIT 0 , 30
    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      id  |  img_small
    -----|--------------
       8 | NULL
       9 | NULL
     10  |  0
    --------------------
    Bon, donc la pourquoi j'ai un zero plutot qu'un 1 ou NULL ?

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par FMaz
    Bon, donc la pourquoi j'ai un zero plutot qu'un 1 ou NULL ?
    C'est très simple: parce que tout à l'heure, avec ton produit cartésien (qui n'était pas fait exprès), tu forcais la valeur de img_small à 1 (je t'ai décrit ce qui se passe exactement, relis bien et tu comprendras), alors que dans ta base de données tu n'as pas cette valeur.

    En fait, je souhaiterais savoir ce que tu souhaites faire exactement. Tu as une galerie d'images, ça j'ai compris. Tu veux les afficher mais:
    - est-ce que tu veux TOUTES les afficher et afficher une mention si elle existe, ou
    - est-ce que tu veux afficher seulement celles qui ont une mention?

    Qu'est-ce que tu appelles une "mention"?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    Une mention, c'est un prix.
    Si l'image à recu un prix, une distinction, la requête va vérifier si la mention créé doit être affichée ou non.

    Donc je cherche à déterminer si l'image à une mention à afficher ou non.
    Si elle n'a pas de mention, l'image doit quand meme être affichée.

    J'ai refait cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT i . * , SUM(m.img_small)
    FROM 2g3p_j_galerie_image AS j
    LEFT JOIN 2g3p_image AS i ON ( i.id = j.id_image )
    LEFT JOIN 2g3p_j_mention_image AS jm ON ( jm.id_image = j.id_image )
    LEFT JOIN 2g3p_mention AS m ON (m.id = jm.id_mention )
     
    WHERE j.id_galerie = '2'
    GROUP BY i.id
    LIMIT 0 , 30
    Qui me permet de voir si il y au moins une mention, mais c'est un peu laid comme facon de faire car j'ai pas réellement besoin de la SUM(). Je veux juste savoir si c'est pas null.

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Quelques explications sur les rôles des différentes tables, sur ce que tu veux et si en plus tu supprimais le html (que je ne parle pas fluently), et ce serait plus facile de t'aider.

  7. #7
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    2g3p_galerie : table contenant la liste des galeries
    2g3p_image : table contenant la liste des images
    2g3p_mention : table contenant la liste des mention (avec la propriété img_small qui indique si on doit afficher ou non la mention dans la galerie)
    2g3p_j_mention_image : table de jointure qui sert à attribuer des mentions à une image
    2g3p_j_galerie_image : table de jointure qui sert à attribuer des image à une galerie.

    Voilà !

    Edit: pour le "html", c'est ce forum qui supporte pas totalement le BBcode.
    je vais essayer de corriger ca...

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par FMaz
    Je veux juste savoir si c'est pas null.
    Plus exactement, ce que tu veux savoir, c'est si une au moins n'est pas nulle. Pour ce faire, tu peux utiliser un COUNT(m.img_small).

    Pour rappel, un COUNT(*) retournera le nombre de ligne, qu'il y ait de éléments NULL ou non nuls; alors que COUNT(nomColonne) comptera le nombre d'éléments non nuls de la colonne.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Membre chevronné
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Par défaut
    C'est vraiment la meilleurs facon ?

    Quoi qu'il en soit ca fonctionne et je vous en suis reconnaissant, merci

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par FMaz
    C'est vraiment la meilleurs facon ?
    Pour faire ce que tu veux faire, tu es obligé de faire un GROUP BY et donc d'utiliser des fonctions d'aggrégation (comme COUNT ou SUM)

    Citation Envoyé par FMaz
    Quoi qu'il en soit ca fonctionne et je vous en suis reconnaissant, merci
    De rien, mais tu peux me tutoyer, il y a des chances que je sois plus jeune que toi...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. problème de jointure je pense
    Par Dam1en dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/01/2008, 00h04
  2. Probléme de jointure
    Par Ajrarn dans le forum Langage SQL
    Réponses: 14
    Dernier message: 24/02/2005, 14h57
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 15h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 21h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 11h27

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