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 :

clause MAX() dans un GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut [resolu]clause MAX() dans un GROUP BY
    Bonjour a la communaute ,

    J'essaye de ressoudre un insondable probleme de jointure ou de sous requete je ne saurai trop dire , car plus je tente des syntaxe differentes plus j'y pert mon latin.

    Ce que je souhaite c'est recuperer plusieurs donnees d'une ligne d'une table contenant une valeur maximale via une jointure .

    Voila ma 1ere table :

    id id_pseudo titre
    5 1 ma nouvelle tache
    6 1 Nouvelles tables


    Voila ma 2eme table :

    id_etat id_tache etat date
    1 5 0 1
    2 5 10 3
    3 6 0 2
    5 5 7 5
    6 6 8 6


    Voila la requete par un HAVING

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT		                          
    afaire.id AS id,
    afaire.titre AS titre,
    afaire_etat.id_tache AS id_afaire,
    afaire_etat.etat AS etat,
    afaire_etat.date AS date
    FROM	afaire 
    LEFT JOIN afaire_etat ON afaire_etat.id_tache=afaire.id 
    GROUP BY titre  
    HAVING afaire_etat.date=MAX(afaire_etat.date)
    Qui ne me donne aucun resultat :/

    Alors que la requete suivante me les renvoie toutes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT		                          
    afaire.id AS id,
    afaire.titre AS titre,
    afaire_etat.id_tache AS id_afaire,
    afaire_etat.etat AS etat,
    afaire_etat.date AS date
    FROM	afaire 
    LEFT JOIN afaire_etat ON afaire_etat.id_tache=afaire.id 
    GROUP BY titre
    Donc pourquoi un HAVING MAX ne me renvoie rien

    Autre requete par un MAX dans le select sans HAVING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    afaire.id AS id,
    afaire.titre AS titre,
    afaire_etat.id_tache AS id_afaire,
    afaire_etat.etat AS etat,
    MAX(afaire_etat.date) AS date
    FROM	afaire 
    LEFT JOIN afaire_etat ON afaire_etat.id_tache=afaire.id
    GROUP BY titre
    qui me donne :

    id titre id_afaire etat date
    5 ma nouvelle tache 5 0 5
    6 Nouvelles tables 6 0 6

    Le probleme etant que etat = 0 alors qu'il devrait etre de 7 et de 8 .

    Si un genie pouvais mettre le doigt sur ce que je n'arrive pas a saisir .

    Merci d'avance.

  2. #2
    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 059
    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 059
    Par défaut
    Et non, ça ne peut pas marcher comme tu le décris...
    Ton GROUP BY s'applique à tous les champs. Pour le MAX(date) ça fonctionne, mais tu essaies également de regouper, par là-même, la colonne etat, et du coup MySQL renvoie la première valeur qu'il rencontre pour cette colonne, soit 0 dans les 2 cas...
    Pour faire ce que tu souhaites, il te faut forcément passer par une sous-requête (donc avec une version de MySQL 4.1 minimum).
    Voici une solution possible (j'ai remplacé le left join par un inner join, parce qu'il n'apporte rien dans la synthaxe suivante) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.id, a.titre, b.id_tache, b.etat, b.date
    from afaire a
    inner join afaire_etat b on a.id = b.id_tache
    where b.date = (select max(date) from afaire_etat c where c.id_tache = b.id_tache)
    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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Merci pour ta reponse eclairee .

    En testant le code je me suis apercu de ca dans le eskuel de mon site :

    MySQL4.0

    Donc je vais deja essaye de soudoyer mon hebergeur pour qu'il me passe en msql 4.1 .

    Merci encore.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/07/2012, 18h35
  2. clause HAVING et MAX avec un GROUP BY
    Par EnRadeSurEclipse dans le forum Requêtes
    Réponses: 27
    Dernier message: 23/02/2010, 00h22
  3. Group by, Max dans tAggregateRow!
    Par wahab2052 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 24/09/2009, 10h34
  4. Problème dans requête avec clause MAX
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/10/2007, 17h00
  5. [ORACLE] max dans la clause where
    Par Cupidon dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/12/2006, 16h58

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