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 :

jointure, remplacer champ manquant par 0 (LEFT JOIN ne marche pas)


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut jointure, remplacer champ manquant par 0 (LEFT JOIN ne marche pas)
    bonjour à tous

    je cherche à savoir si il est possible que lors d'une jointure si des gens n'existe pas il se voit attribuer la valeur zéro plutôt que de faire sauter la ligne.

    Exemple, si la base de donnée est celle d'une association

    une table définie les membres (membre)=>membre_id, membre_nom
    une les activités(activite)=> activité_id, activité_nom

    et une les liens entre les deux(act_memb)=>
    activité_id,membre_id

    si il y a dix activité mais que le membre 1 ne participe qu'a deux d'entre elle,
    la requete
    SELECT * FROM membre CROSS JOIN act_memb USING(membre_id) WHERE membre_id=1

    ne donnera que 2 lignes
    je voudrais savoir comment forcer un résultat à 10 lignes avec des champs vides qui apparaissent.
    ça n'a dans cet exemple aucun intérêt mais dans mon code plus long et avec plus de table ça m'évite des select en cascade derrière.
    merci d'avance.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Dans ce cas là c'est une jointure externe qu'il te faut LEFT ou RIGHT JOIN
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut
    bonjour, j'ai testé ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM batiments_type
    LEFT OUTER JOIN batiments ON ( batiments_type.bat_type_id = batiments.bat_type_id )
    WHERE bat_user_id =2
    j'ai testé avec ou sans OUTEr => juste LEFT JOIN (identique)

    Et si je mets bat_user_id=1 j'ai bien un retour avec des réponses.

    Je voudrais que mon code m'indique pour chacun de ces types de batiments l'user n'en a pas.

    merci d'avance

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    bat_user_id est une colonne de quelle table ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut
    c'est une colonne de batiments.
    suite à ton mess j'ai testé
    en where batiments.bat_user_id mais ça ne donne rien .

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Il faut inverser la jointure externe et mettre WHERE batiments.bat_user_id = 2 OR batiments.bat_user_id IS NULL
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM batiments_type
    LEFT JOIN batiments ON ( batiments_type.bat_type_id = batiments.bat_type_id )
    WHERE batiments.bat_user_id =1
    OR batiments.bat_user_id IS NULL

    j'ai testé avec ceci et j'ai bien tout ce qu'il faut pour l'user 1
    les 2 premiers type de batiments complété et null pour le dernier .
    or chose étrange.

    l'user 2 n'a lui aucun batiment,
    et si j'éxécute la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM batiments_type
    LEFT JOIN batiments ON ( batiments_type.bat_type_id = batiments.bat_type_id )
    WHERE batiments.bat_user_id =2
    OR batiments.bat_user_id IS NULL
    je n'ai qu'un seul batiment qui apparait , celui que l'user 1 ne possède pas.

    Note que si je mets un RIGHT JOIN ca ne change rien.

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Déjà SELECT * sur une jointure, c'est plus que limite.
    Si tu décrivais précisément la projection attendue, en préfixant les colonnes du nom de la table, j'y verrais probablement plus clair.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut
    Ma table batiments contient les champs bat_id, bat_type_id, bat_user_id et, bat_nombre et d'autres...
    Ma table batiments_type, contient bat_type_id, bat_nom, bat_description et d'autres...

    mais mettons que je ne veuille que récupérer les batiments.bat_id qui correspondent a batiments_type.bat_type_id

    j'utilise donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT batiments.bat_id, batiments_type.bat_type_id
    FROM batiments_type
    LEFT JOIN batiments ON ( batiments_type.bat_type_id = batiments.bat_type_id )
    WHERE batiments.bat_user_id =1
    OR batiments.bat_user_id IS NULL
    Je ne vois d'ailleur au passage pas l'intérêt du IS NULL car le but du left join est justement de rendre la table de gauche obligatoire non ?

  10. #10
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Je ne vois d'ailleurs au passage pas l'intérêt du IS NULL car le but du left join est justement de rendre la table de gauche obligatoire non ?
    Là tu confonds deux notions : la clause de jointure ON et la clause de filtre WHERE.
    Si la clause de filtre n'est pas réalisée la jointure ne retourne rien.
    Or comme le filtre porte sur une colonne de la table gauche....
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut
    Ben la où je bloque c'est que :
    j'ai 3 types de batiments
    A, B et C

    l'utilisateur 1 possède le A et le C
    l'utilisateur 2 possède le C

    Si je fais une requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT batiments.bat_id, batiments_type.bat_type_id
    FROM batiments_type
    LEFT JOIN batiments ON ( batiments_type.bat_type_id = batiments.bat_type_id )
    j'ai comme réponse
    A 1
    B NULL
    C 1
    C 2

    je veux juste pouvoir sortir les infos pour un seul user
    et avoir
    A 1
    B NULL
    C 1

  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Tu avoueras que tes noms de colonnes sont tout sauf explicite.
    Quelle différence entre un bâtiment et un type de bâtiment ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 178
    Points
    178
    Par défaut
    pour info le bat_id correspond au numéro du batiments possèder par le joueur

    c'est pour une clé primaire unique plus courte qu'un enselmble bat_user_id et bat_type id regroupé.

    BON SINON C'EST RESOLU merci à OMEDO

    il fallait en fait faire une jointure avec le AND bat_user_id inclus dans le ON()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM batiments_type
    LEFT JOIN batiments ON ( batiments_type.bat_type_id = batiments.bat_type_id AND batiments.bat_user_id=2)

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

Discussions similaires

  1. Lier un produit cartésien a une table par un left join
    Par eliamat dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/12/2014, 14h51
  2. Jointure avec champ manquant
    Par Nouacha dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/05/2011, 17h49
  3. Remplacer champ booléen par image
    Par alexxxx69 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/12/2010, 17h58
  4. LEFT JOIN qui marche ? pas normal !
    Par gok6tm dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/11/2007, 20h53
  5. Réponses: 3
    Dernier message: 06/06/2007, 18h45

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