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 :

Probleme double jointure


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Probleme double jointure
    Bonjour,

    J'ai cette requete sql :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT itemnum, itemname, ti_itemmixinginfo.uniqueid, ti_itemmixingelement.sourceitemnum, ti_itemmixingelement.sourceitemcount
    FROM ti_item
    INNER JOIN ti_itemmixinginfo ON ti_item.itemnum = ti_itemmixinginfo.targetitemnum
    INNER JOIN ti_itemmixingelement on ti_itemmixinginfo.uniqueid = ti_itemmixingelement.uniqueid
    WHERE ti_itemmixinginfo.targetitemnum = 7008400


    Ce qui donne sa :


    sauf que l'itemname et toujours le meme
    il me faut afficher les itemname don't l'id et sourceitemnum

    et la table des nom est dans ti_item
    colonne itemname

    Merci

  2. #2
    Expert éminent
    Bonjour,
    IL nous faudrait la description des tables, un jeu de test et le résultat attendu.
    En attendant, je vais (tenter de ) réécrire ta requête en préfixant toutes les colonnes, et en utilisant des alias:
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT item.ItemNum, item.ItemName, info.UniqueId, element.SourceµItemNum, element.SourceItemCount
    FROM ti_item as item
    INNER JOIN ti_itemmixinginfo as info ON item.ItemNum = info.TargetItemNum
    INNER JOIN element on info.UniqueId = element.UniqueId
    WHERE info.TargetItemNum = 7008400

    On vois sur la dernière ligne que tu fais une restriction sur info.TargetItemNum.
    Et d'après la première jointure, info.TargetItemNum = item.ItemNum
    Comme le nom est dans la table item, il est tout à fait normal que toutes les lignes affichent le même nom.

    Tatayo.

  3. #3
    Candidat au Club
    Merci de ncotre reponse

    J'ai corrigé le code
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT item.itemnum, item.itemname, info.uniqueid, element.sourceitemnum, element.sourceitemcount
    FROM ti_item as item
    INNER JOIN ti_itemmixinginfo as info ON item.ItemNum = info.TargetItemNum
    INNER JOIN ti_itemmixingelement as element on info.uniqueid = element.uniqueid
    WHERE info.targetitemnum = 7008400


    J'ai le meme reultat, comment afficher les nom des items correct, sachant que l'id et targetitemnum

  4. #4
    Membre averti
    Bonjour,

    Quelles sont les structures des tables? Quelles sont les clés primaires?
    Quand tu écris "et", veux-tu dire "est", car je ne suis pas sûr si tu veux une colonne ET une autre ou si tu dis qu'une donnée EST dans une colonne?

  5. #5
    Candidat au Club
    il me faut afficher les itemname don't l'id est sourceitemnum

    et la table des nom est dans ti_item
    colonne itemname

    PS : j'ai edité les faute

  6. #6
    Expert éminent
    Le problème ici est que nous n'avons ni structure des table, ni jeu de test, ni résultat attendu.
    Du coup on ne sait pas en quoi le résultat est incorrect.
    Comme je l'indiquais, vu ta requête il est normal que toutes les lignes affichent le même nom, puisque tu filtres sur L'Id de la table item (indirectement certes).
    Si tu n'as donc qu'une ligne de item qui est retenue, toutes les lignes du résultat portent sur une seule ligne de Item, donc elles affichent toutes le même nom.
    Les alias que j'ai ajoutés dans la requête ne sont là que pour améliorer la lisibilité, ils ne changent rien au résultat.
    De même préfixer toutes les colonnes du SELECT nous permet de savoir quelle colonne vient de quelle table.

    Bref:
    1. Structure des tables (colonnes, clé primaire, liens entre elles)
    2. Jeu de test
    3. Résultat attendu

    Sans ces éléments, impossible de te répondre.

    Tatayo.

  7. #7
    Candidat au Club
    J'ai 3 tablemais la requete et le resultat sont deja montré.

    Ce que j'attends c'est sa :

  8. #8
    Expert éminent
    Citation Envoyé par Yu-Chan Voir le message
    J'ai 3 table mais la requête et le résultat sont déjà montrés.

    Ce n'est pas le nombre de tables qui nous intéresse, mais la STRUCTURE de ces tables, et les liens entre elles (clés étrangères).
    On attends toujours aussi un jeu de test.
    Et le résultat que tu nous montres n'au aucun rapport avec la demande initiale.

    Par contre il ressemble étrangement à celui que tu veux dans une autre discussion.
    Ici tu sembles vouloir à partir d'un item source, avoir l'id et le nom d'un item "destination" (avec une ligne par couple source/destination ?). Dans l'autre, tu veux faire un pivot (ou ce qui ressemble à un pivot).
    Ce sont deux choses totalement différentes, qui demandes des requêtes totalement différentes.

    Et sans la structure des tables, sans connaitre les liens entre elles, sans jeu de test, tu n'auras aucune réponse.

    Tatayo.

  9. #9
    Candidat au Club
    Donc voila la structure de
    ti_item : http://www.pastecode.fr/BFHqeb2WW8
    ti_itemmixinginfo : http://www.pastecode.fr/3DcppwV7C9
    ti_itemmixingelement : http://www.pastecode.fr/WiLH6gMEtJ


    Voila

  10. #10
    Expert éminent
    Il nous manque toujours le lien entre les tables, et le jeu de test…
    Mais surtout ce que tu demande là n'a aucun rapport avec la demande initiale, et correspond bien à cette autre discussion.

    Ta demande ici était d'afficher l'id et le nom d'un item A, et sur la même ligne l'id et le nom d'un item B. Ce qui nous fait une ligne par couple item A / Item B.
    Maintenant tu veux pour u item A tous les autres item qui lui sont liés.
    Ce n'est pas la même chose du tout.

    Tatayo.

  11. #11
    Candidat au Club
    J'ai fait cette requête

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	    $sql = "select  distinct 
        ( SELECT t2.itemname FROM ti_item AS t2 WHERE t2.itemnum = ti_itemmixingelement.sourceitemnum ) AS itamename1, ti_itemmixingelement.sourceitemcount       
    from    ti_item        
    inner join ti_itemmixinginfo on  ti_item.itemnum = ti_itemmixinginfo.targetitemnum
    inner join ti_itemmixingelement   on  ti_itemmixinginfo.uniqueid = ti_itemmixingelement.uniqueid
    WHERE ti_itemmixinginfo.targetitemnum = {$id}";
    	    $conn = $this->bdd->prepare($sql);


    Ça fonctionne j'ai ce tableau en retour :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    array(4) { ["itamename1"]=> string(20) "High Purity Catalyst" [0]=> string(20) "High Purity Catalyst" ["sourceitemcount"]=> string(1) "1" [1]=> string(1) "1" } array(4) { ["itamename1"]=> string(22) "High Purity Netine Ore" [0]=> string(22) "High Purity Netine Ore" ["sourceitemcount"]=> string(1) "2" [1]=> string(1) "2" } array(4) { ["itamename1"]=> string(8) "Edcanium" [0]=> string(8) "Edcanium" ["sourceitemcount"]=> string(1) "1" [1]=> string(1) "1" } array(4) { ["itamename1"]=> string(15) "Soft Moissanite" [0]=> string(15) "Soft Moissanite" ["sourceitemcount"]=> string(1) "1" [1]=> string(1) "1" } array(4) { ["itamename1"]=> string(6) "Nickel" [0]=> string(6) "Nickel" ["sourceitemcount"]=> string(1) "1" [1]=> string(1) "1" }


    Mais ma question est comment récupérer item par item et récupérer sourceritemcount pour chaque colonne