Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure avec conditions

Sujet résolu
    12 septembre 2017 à 11:52:09

    Bonjour,

    Je souhaite effectuer une jointure sur 3 table qui sont :

    Table CONVOYEUR :

    CREATE TABLE `convoyeur` (
      `id` bigint(20) NOT NULL,
      `id_member` int(11) NOT NULL 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    TABLE ACCOUNT

    CREATE TABLE `account` (
      `id` int(11) NOT NULL 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    TABLE INTERVENTION :

    CREATE TABLE `intervention` (
      `id` int(11) NOT NULL,
      `id_convoyeur` int(11) NOT NULL,
      `date_intervention` date DEFAULT NULL,
      `intervention_qui` varchar(50) COLLATE utf8_bin DEFAULT NULL,
      `intervenant` varchar(50) COLLATE utf8_bin DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    L'idée est de sélectionner chaque convoyeur - une seule fois convoyeur.id

    lorsque convoyeur.id_member = account_id

    avec la DERNIERE intervention (intervention.id) de ma table INTERVENTION sur le convoyeur intervention.id_convoyeur

    Dans un premier temps je fais cette simple requete :

    SELECT j.id, j.id_member, k.id, l.id, l.id_convoyeur
    FROM convoyeur j
    INNER JOIN account k ON k.id = j.id_member
    LEFT JOIN intervention l ON l.id_convoyeur = j.id
    WHERE j.id_member = "1" ORDER BY j.id

    Pas de souci.

    Mais si je rajoute intervention.date_intervention, intervention.intervention_qui, intervention.intervenant je me retrouve avec des convoyeurs affiché plusieurs fois s'ils ont plusieurs interventions...

    SELECT j.id, j.id_member, k.id, l.id, l.id_convoyeur, l.date_intervention, l.intervention_qui, l.intervenant
    FROM convoyeur j
    INNER JOIN account k ON k.id = j.id_member
    LEFT JOIN intervention l ON l.id_convoyeur = j.id
    WHERE j.id_member = "1" ORDER BY j.id


    Il faut que je ne retrienne que la dernière intervention en date, la plus récente.

    Et je ne vois pas comment faire.


    Merci de vos retours.




    -
    Edité par BenoîtDESCOURS 12 septembre 2017 à 11:53:06

    • Partager sur Facebook
    • Partager sur Twitter
      12 septembre 2017 à 13:28:26

      Salut Benoît,

      Tu peux essayer ça :

      SELECT j.id, j.id_member, k.id, l.id, l.id_convoyeur, l.date_intervention, l.intervention_qui, l.intervenant
      FROM convoyeur j
      INNER JOIN account k ON k.id = j.id_member
      LEFT JOIN intervention l ON l.id_convoyeur = j.id
      WHERE j.id_member = "1" ORDER BY j.id, l.date_intervention DESC LIMIT 1

      Bonne journée,

      JiJi62

      • Partager sur Facebook
      • Partager sur Twitter
        12 septembre 2017 à 17:08:14

        Non, ça me retourne uniquement 1 convoyeur, celui pour lequel l'intervention est la plus récente.

        Je veux tous mes convoyeurs avec pour chacun d'entre eux, la dernier intervention qu'ils ont subis.

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          12 septembre 2017 à 17:22:06

          Bonjour,

          Je crains qu'il faille passer par une sous-requête pour déterminer pour chaque convoyeur la dernière intervention :

          SELECT
          	j.id,
          	j.id_member,
          	k.id,
          	l.id,
          	l.id_convoyeur,
          	l.date_intervention,
          	l.intervention_qui,
          	l.intervenant
          FROM
          	convoyeur j
          		INNER JOIN account k
          			ON k.id = j.id_member
          		LEFT JOIN (
          				-- Dernière intervention par convoyeur
          				SELECT id_convoyeur, MAX(id) AS max_id
          				FROM intervention
          				GROUP BY id_convoyeur
          			) AS mi
          			ON j.id = mi.id_convoyeur
          		LEFT JOIN intervention l
          			ON l.id_convoyeur = j.id
          			AND mi.max_id = l.id
          WHERE j.id_member = 1
          ORDER BY j.id

          J'ai considéré que le plus haut id intervention est aussi le plus récent, si ce n'est pas le cas, il faudra remplacer id par date_intervention dans la sous-requête et dans la jointure ...

          Après, si tu a forcément au moins une intervention pour chaque convoyeur ou que tu ne veux que les convoyeurs qui ont au moins une intervention, alors tu peux remplacer les LEFT JOIN par des INNER JOIN ;)

          -
          Edité par Benzouye 12 septembre 2017 à 17:24:40

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            12 septembre 2017 à 23:25:14

            Alors merci infiniment !

            Je vais trier par date pour être sûr même si en théorie le plus id intervention est le plus récent.


            Merci encore !

            • Partager sur Facebook
            • Partager sur Twitter

            Jointure avec conditions

            × 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