Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL] Recherche avec jointures

Besoin d'aide :-)

    11 septembre 2010 à 19:28:05

    Bonjour,

    Je commence à sérieusement me mélanger les pinceaux avec ma requête un peu d'aide / conseil serait le bienvenu:

    Alors j'ai plusieurs tables:

    La table achat qui contient Id_ticket, Id_article et Libelle_ligne
    La table articles qui contient son Id
    La table ticket qui contient son Id, Id_magasin et Date_achat
    La table magasins qui contient son Id et Nom

    J'ai en entrée Id_article et je voudrais trouver le Libelle_ligne du dernier Date_achat
    Alors ça c'est juste l'échauffement et j'y suis arrivé:

    SELECT
    ach.Libelle_ligne AS Libelle_ligne
    FROM
    (((`ach_articles` `art`
    JOIN `ach_achats` `ach` ON ((`art`.`Id` = `ach`.`Id_article`)))
    JOIN `ach_tickets` `tic` ON ((`tic`.`Id` = `ach`.`Id_ticket`)))
    JOIN `ach_magasins` `mag` ON ((`mag`.`Id` = `tic`.`Id_magasin`)))  
    WHERE
    `art`.`Id`=:Id_article
    ORDER BY
    tic.Date_achat DESC
    LIMIT
    1
    


    Seulement voilà j'aimerais rajouter une condition supplémentaire:

    Je rajoute en entrée Id_ticket et je voudrais que le résultat ne comprenne que le Libelle_ligne d'un achat dans le même Nom de magasin...
    Mon soucis c'est que Nom se trouve dans la table magasins alors que je dois le lier par Id_ticket qui ne s'y trouve pas...


    Je ne sais pas si j'ai été bien clair mais je bloque avec toutes ces jointures je ne vois pas comment avancer.

    Merci de m'avoir lu et désolé si je vous ai embrouillé le cerveau :lol:
    • Partager sur Facebook
    • Partager sur Twitter
      11 septembre 2010 à 20:48:27

      Est-ce que ça serait possible de nous donner la structure de tes tables, un jeu d'essai suffisant et le résultat escompté ? J'ai de la difficulté à comprendre ce que tu veux faire précisément.
      • Partager sur Facebook
      • Partager sur Twitter
        12 septembre 2010 à 0:06:16

        Si j'ai bien compris, tu veux ajouter comme condition le choix du magasin à partir d'un numéro de ticket.

        Si c'est ça, essaye cette requête :

        SELECT
        ach.Libelle_ligne AS Libelle_ligne,
        ach_magasins.Nom AS Nom
        FROM
        (((`ach_articles` `art`
        JOIN `ach_achats` `ach` ON ((`art`.`Id` = `ach`.`Id_article`)))
        JOIN `ach_tickets` `tic` ON ((`tic`.`Id` = `ach`.`Id_ticket`)))
        JOIN `ach_magasins` `mag` ON ((`mag`.`Id` = `tic`.`Id_magasin`)))  
        WHERE
        `art`.`Id`=:Id_article
        AND `tic`.`Id_magasin` = (select `tic2`.`Id_magasin`
        			  from
        			  `ach_tickets` `tic2`
        			  WHERE
        			  `tic2`.`Id_ticket` =:ticket)
        ORDER BY
        tic.Date_achat DESC
        LIMIT
        1
        
        • Partager sur Facebook
        • Partager sur Twitter
          12 septembre 2010 à 11:29:20

          Merci pour votre aide pas évident à expliquer ce que je veux faire :-)

          Alors bwaim c'est presque ça, mais je veux que le Nom du magasin corresponde et non son Id car pour des Id différentes il peut y avoir le même Nom.

          J'y suis parvenu comme cela:
          SELECT
          ach.Libelle_ligne AS Libelle_ligne,
          mag.Nom AS Nom
          FROM
          (((ach_articles art
          JOIN ach_achats ach ON ((art.Id = ach.Id_article)))
          JOIN ach_tickets tic ON ((tic.Id = ach.Id_ticket)))
          JOIN ach_magasins mag ON ((mag.Id = tic.Id_magasin)))  
          WHERE
          art.Id=:Id_article
          AND mag.Nom = (SELECT mag2.Nom
          			  FROM
          			  (ach_tickets tic2
                                    JOIN ach_magasins mag2 ON ((mag2.Id = tic2.Id_magasin)))  
          			  WHERE
          			  tic2.Id =:Id_ticket)
          ORDER BY
          tic.Date_achat DESC
          LIMIT
          1
          

          Mais c'est une requête imbriquée dans une autre requête n'y a t-il pas moyen d'utiliser les jointure pour être plus "propre"?
          Lorsque la BDD sera très volumineuse cette requête ne va pas mettre trop longtemps à être exécutée?
          • Partager sur Facebook
          • Partager sur Twitter
            12 septembre 2010 à 16:04:00

            C'est pour ça que j'aurais aimé que tu nous donnes un jeu d'essai et le résultat souhaité, ça serait plus facile (pour moi en tout cas) de visualiser précisément ce que tu veux.
            • Partager sur Facebook
            • Partager sur Twitter
              12 septembre 2010 à 16:24:06

              Fayden, je ne sais pas ce qu'est un jeu d'essai... Peut-être parle tu d'un exemple de données?

              Alors pour être plus clair:

              1)structure des tables
              Achat Articles Tickets Magasins
              Id Id Id Id
              Id_ticket ... Id_magasin Nom
              Id_article ... Date_achat ...
              Libelle_ligne ... ... ...


              2) Voila un exemple pour des enregistrements fonctionnant ensembles

              Champ Valeur
              Id Numéro auto
              Id_ticket 12
              Id_article 26
              Libelle_ligne Chocolat


              Champ Valeur
              Id Numéro auto
              Id_ticket 12
              Id_article 32
              Libelle_ligne Lait


              Champ Valeur
              Id 12
              Id_magasin 7
              Date_achat 12/09/2010


              Champ Valeur
              Id 7
              Nom Carrefour



              3) Ce que je veux obtenir

              En ayant Id_article et Id_ticket, trouver Libelle_ligne du dernier achat ayant le même nom de magasin (et non le même Id_magasin car il peut y avoir plusieurs noms identiques avec des Id différents)
              • Partager sur Facebook
              • Partager sur Twitter
                12 septembre 2010 à 16:46:20

                Oui, un jeu d'essai est un exemple de données.

                Essaie cette requête, ça semble bien me donner les bons résultats après avoir fait quelques tests.

                SELECT A.Libelle_ligne, M.Nom
                FROM tickets T
                INNER JOIN magasins M
                    ON T.Id_magasin = M.Id
                INNER JOIN 
                    (
                        SELECT M2.Nom, MAX(T2.Date_achat) AS maxDateAchat
                        FROM tickets T2
                        INNER JOIN magasins M2
                            ON T2.Id_magasin = M2.Id
                        GROUP BY M2.Nom
                    ) E
                    ON E.Nom = M.Nom
                        AND E.maxDateAchat = T.Date_achat
                INNER JOIN achat A
                    ON T.Id = A.id_ticket
                WHERE A.Id_article = 26
                    AND T.Id = 12;
                
                • Partager sur Facebook
                • Partager sur Twitter

                [SQL] Recherche avec jointures

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown