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 :

Maximum dans un LEFT JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut Maximum dans un LEFT JOIN
    Bonjour,

    Prenons un exemple (je simplifie, c'est beaucoup trop complexe sinon ^^'):


    J'ai deux tables, l'une constituée des données d'un user, l'autre de son historique journalier :

    user_id, user_name, user_count (table user)

    user_id, user_count, user_date (table user_history)


    Maintenant, les données :

    table user :

    1, premier, 46

    2, deuxième, 58
    table user_history

    1, 48, 2013-06-20

    2, 10, 2013-06-21

    1, 54, 2013-06-23

    Je voudrais récupérer la date maximale de chaque user_id.

    Pour l'instant, j'ai ça :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT u.user_id, u.user_points, h.user_id, MAX(h.date_creation) as date_creation
    FROM user u
    LEFT JOIN user_history h ON (h.user_id = u.user_id)
    GROUP BY u.user_id

    Mais cela ne récupère pas selon la valeur maximale de la date, n'étant pas la même pour chaque user_id.

    MAX ne me retourne que la colonne en question, pas toute la ligne qui va avec ...

    Merci de votre aide !

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Bonjour,

    J'ai travaillé sur la requête, je me retrouve avec ce modèle (simplifié bien entendu):

    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    u.*,
    uh.user_count,
    uh.user_date,
    FROM user u
    LEFT JOIN user_history uh ON (uh.user_id = u.user_id AND uh.date =
            (
                SELECT MAX(date) as date 
                FROM user_history
                WHERE date <= "2013-06-25" AND user_id = uh.user_id
            ))

    Ceci marche très bien, mais y a-t-il un moyen d'optimiser la requête ?

    Cordialement,

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    oui il y a moyen d'optimiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    u.*,
    uh.user_count,
    uh.user_date,
    FROM user u
    left outer join (SELECT user_id, MAX(date) AS max_dte 
                FROM user_history
                WHERE date <= "2013-06-25"
               group by user_id)  as tmp on tmp.usr_id = u.usr_id
    LEFT JOIN user_history uh ON tmp.user_id = uh.user_id and tmp.max_dte = uh.date

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Merci pour ta réponse,

    A moins que ça soit moi, cette requête est bien plus lente que la précédente ... (1s vs 56s)

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Moi ce que je vois :

    votre requete vas éxécuter autant de fois la sous requete avec la date que vous n'avez d'utilisateur (voir de ligne dans l'historique ? faudrai regarder le plan d'execution).

    La requete que je vous présente, n'effectue qu'une seule fois la sous requete afin de ressortir les couples user_id / date_max.


    A partir de là :
    - vous utilisez une clause where non présente dans lexemple qui diminue le nombre de user traité => gardez votre requete
    - il manque des indexs (en particulier le couple user_id, date)
    - MySql est pire que ce que je pensais => gardez votre requete

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Ma requête reste quand même longue la première fois ...

    Je vais réessayer ta requête ...

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Je viens d'adapter ta requête dans ma situation, ça marche en fait du tonnerre ! J'avais fait une erreur de matin, merci énormément !

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

Discussions similaires

  1. Utiliser MAX() en condition dans un LEFT JOIN
    Par comode dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/05/2012, 21h49
  2. [MySQL] Select dans un Left Join et champ inconnu
    Par wenijah dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 13/04/2012, 12h19
  3. "fetch first 1 rows only" dans un "Left Join"
    Par nico.exe dans le forum DB2
    Réponses: 5
    Dernier message: 02/04/2012, 16h25
  4. Requete SQL - count dans un left join
    Par JbWillGetYou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/06/2010, 01h07
  5. count() dans *plusieurs* LEFT JOIN
    Par silver_dragoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2004, 17h20

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