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

Requêtes MySQL Discussion :

LEFT JOIN + ORDER


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut LEFT JOIN + ORDER
    Bonjour,
    Je suis sur une requête SQL un peu complexe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT envoi_push.id, envoi_push.msgid, envoi_push.senderid, envoi_push.number, envoi_push.content, confirm_push.status 
    FROM envoi_push 
    LEFT JOIN confirm_push ON envoi_push.msgid=confirm_push.msgid 
    WHERE Mt=1 
    GROUP BY envoi_push.id LIMIT 10; // Limit for test
    Le but est d'en resortir : envoi_push.id, envoi_push.msgid, envoi_push.senderid, envoi_push.number, envoi_push.content de la 1ère table.
    et confirm_push.status de la 2ème table.

    Le soucis : C'est que la liaison ici :

    envoi_push.msgid=confirm_push.msgid

    il existe plusieurs msgid identiques dans la table confirm_push.

    et actuellement: le système prend n'importe lequel.. il me faudrait celui qui répond à la plus grande DATE ou ID. ( confirm_push.id ou confirm_push.date )

    Que faire?
    Je suis loin d'être un pro SQL :-)

  2. #2
    Membre averti
    Inscrit en
    Août 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2005
    Messages : 39
    Par défaut
    Bonjour,

    Essaye de faire un GROUP BY envoi_push.id, max(date)

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Bonjour,

    Pour faire ça, il va falloir faire des sous-requêtes. Il faut donc que la version de MySQL soit au moins la 4.1...
    Première étape : sélectionner pour chaque msgid de confirm_push le status du dernier message (celui de plus grand id) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT msgid, status
    FROM confirm_push
    WHERE id IN (
      SELECT MAX(id)
      FROM confirm_push
      GROUP BY msgid
    )
    Le résultat de cette requête va servir de table de jointure dans le LEFT JOIN (ça donne donc 2 sous-requêtes, bonjour les perfs !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT envoi_push.id, envoi_push.msgid, envoi_push.senderid, envoi_push.number, envoi_push.content, c.status 
    FROM envoi_push 
    LEFT JOIN (
      SELECT msgid, status
      FROM confirm_push
      WHERE id IN (
        SELECT MAX(id)
        FROM confirm_push
        GROUP BY msgid
      )
    ) c ON envoi_push.msgid = c.msgid
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Salut Ced, c'est pas que c'est lent. C'est inutilisable ...
    La requête ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT envoi_push.id, envoi_push.msgid, envoi_push.senderid, envoi_push.number, envoi_push.content, c.STATUS 
    FROM envoi_push 
    LEFT JOIN (
      SELECT msgid, STATUS
      FROM confirm_push
      WHERE id IN (
        SELECT MAX(id)
        FROM confirm_push
        GROUP BY msgid
      )
    ) c ON envoi_push.msgid = c.msgid LIMIT 10;
    tourne depuis... 5 minutes et toujours pas d'affichage..

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Ca ne m'étonne pas... 2 sous-requêtes, c'est super lourd...
    Il faut éventuellement passer chacune des sous-requêtes dans des tables temporaires.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Tu devinera jamais, la requête tournait toujours et à finit par cracher Mysql 6h après :-))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. order et left join
    Par bastien dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/12/2009, 12h01
  2. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 17h38
  3. Interbase et left join
    Par Zog dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/03/2004, 09h55
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 22h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 14h57

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