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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 600
    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 600
    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.

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    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

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