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

Langage SQL Discussion :

INNER JOIN avec SELECT


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut INNER JOIN avec SELECT
    Hello
    J'ai 2 tables MySQL:
    1ère table: ticket avec les colonnes: ticket_id ticket_titre ticket_txt
    2ème table: mouvement: mouvement_id, mouvement_type, mouvement_qui, mouvement_date, pieces, mouvement_table_BDD.

    J'aimerais sortir la 1ère valeur selon la date de la table mouvement (valeur de mouvement_type, mouvement_date et mouvement_qui).
    Et la même chose pour la dernière valeur de la table.

    J'ai essayé plein de choses différentes, mais je n'y arrive pas.
    Voilà mon code, est-ce que quelqu'un voit ou je fais faux.
    Merci d'avance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT * 
    FROM `ticket`
    INNER JOIN (
        SELECT `mouvement_type` AS `min_mouvement_type`,`mouvement_qui` AS `min_mouvement_qui`,`mouvement_date`AS `min_mouvement_date` ,`pieces`  
        FROM `mouvement` 
        WHERE `mouvement_table_BDD` LIKE 'ticket'
        ORDER BY `mouvement`.`mouvement_date` DESC
        )AS `first_mouvement` ON `ticket`.`ticket_id`= `first_mouvement`.`pieces`
     
    INNER JOIN (
        SELECT `mouvement_type` AS `max_mouvement_type`,`mouvement_qui` AS `max_mouvement_qui`,`mouvement_date`AS `max_mouvement_date` ,`pieces`  
        FROM `mouvement` 
        WHERE `mouvement_table_BDD` LIKE 'ticket'
        ORDER BY `mouvement`.`mouvement_date` ASC
        )AS `last_mouvement` ON `ticket`.`ticket_id`= `last_mouvement`.`pieces`
    WHERE 1
    GROUP BY `ticket_id`

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut
    Hello
    J'ai trouvé une solution mais elle est tres lente
    y-a-il un moyen d'optimiser la requete?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT * 
    FROM `ticket`
    LEFT OUTER JOIN `mouvement` AS `m1` ON `ticket`.`ticket_id`= `m1`.`pieces` AND `mouvement_table_BDD`= "ticket" AND `m1`.`mouvement_date`=
    	(SELECT MAX(`mouvement_date`)
         FROM `mouvement` AS `s1`
         WHERE `s1`.`pieces` = `ticket`.`ticket_id`
         AND `mouvement_table_BDD`= "ticket"
         GROUP BY `ticket`.`ticket_id`
        )
    ORDER BY `ticket`.`ticket_id` ASC

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Coucou,
    Quelque chose comme cela qui évite une jointure triangulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT * 
    FROM `ticket`t
    LEFT OUTER JOIN 
    	(SELECT s1.`pieces`, MAX(`mouvement_date`) as max_mouvement_date
         FROM `mouvement` AS `s1`
         WHERE `mouvement_table_BDD`= "ticket"
         GROUP BY s1.`pieces`
        ) as mm
    	on t.`ticket_id`= `mm`.`pieces`
    LEFT OUTER JOIN `mouvement` AS `m1` ON mm.`pieces`= `m1`.`pieces` 
    	AND m1.`mouvement_table_BDD`= "ticket" 
    	and m1.mouvement_date=max_mouvement_date
    ORDER BY t.`ticket_id` ASC
    Cordialement
    Soazig

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 942
    Par défaut
    Citation Envoyé par titich Voir le message
    J'aimerais sortir la 1ère valeur selon la date de la table mouvement (valeur de mouvement_type, mouvement_date et mouvement_qui).
    Et la même chose pour la dernière valeur de la table.
    Je ne suis pas sûr de comprendre la demande.Est-ce que "la première valeur" correspond à :
    - 1 mouvement : on veut lister le mouvement le plus ancien (et le plus ressent) dans la liste de tous les tickets
    - par ticket : on veut la 1ere date de mouvement et la dernière (1 ligne par ticket et 2 colonnes en plus)
    - le détail du premier et dernier mouvement par ticket (2 lignes par ticket)
    - autre

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 544
    Billets dans le blog
    10
    Par défaut
    Bonjour

    Les colonnes `ticket`.`ticket_id`= `m1`.`pieces` sont elles bien de même type et de même longueur ?
    Ces colonnes sont elles bien indexées dans chacune des deux tables ?

    Eventuellement, vous pouvez récupérer le max en vérifiant qu'il n'existe pas de ligne ayant une date plus récente avec NOT EXISTS, c'est parfois plus performant qu'une jointure OUTER.

Discussions similaires

  1. Inner Join avec des NULL
    Par BLJ.CHAUVIN dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/07/2011, 11h28
  2. Réponses: 6
    Dernier message: 08/11/2010, 10h52
  3. INNER JOIN avec un LIKE
    Par Spiritueux dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/10/2008, 17h14
  4. Réponses: 7
    Dernier message: 13/12/2007, 13h32
  5. INNER JOIN avec des données de sélection
    Par EK1_ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/05/2006, 18h40

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