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 :

récupération d'une ligne avec un select MAX(champ1)


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut récupération d'une ligne avec un select MAX(champ1)
    Bonjour,

    Je voudrais faire une requete me permettant de récupérer le max d'une valeur et tous les champs correspondant.
    le probleme c'est que je récupère les valeurs d'une autre ligne pour (date, nb, val et type).
    voici la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ID, CLI, CLA, NOM, max(DUREE), DATE, NB, VAL, TYPE 
    FROM TABLE 
    WHERE DUREE>36000 AND NOM like '$nom'
    GROUP BY CLI, CLA
    Comment faire pour récupérer toute la ligne. merci

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Ce n'est possible que pour MySQL >= 4.1 (sous-requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT T.ID, T.CLI, T.CLA, T.NOM, T.DUREE, T.DATE, T.NB, T.VAL, T.TYPE
    FROM TABLE T
    WHERE T.DUREE = (
       SELECT MAX(T2.DUREE)
       FROM TABLE T2
       WHERE T2.CLA = T.CLA AND T1.CLI = T.CLI
    )
       AND T.DUREE > 3600
       AND NOM like '$nom'
    sinon, il te faut faire une première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CLI, CLA, MAX(T2.DUREE)
    FROM TABLE T2
    GROUP BY CLI, CLA
    puis ensuite pour chaque résultat, une autre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID, CLI, CLA, NOM, DUREE, DATE, NB, VAL, TYPE
    FROM TABLE T
    WHERE
       DUREE = @Res[DUREE] AND CLI = @Res[CLI] AND CLA = @Res[CLA]
       AND T.DUREE > 3600
       AND NOM like '$nom'
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt.


    Ma version est la 5.0, alors je sais pas si ca functionne sur les Mysql < 4.1 .


    Mais j´aimerais savoir si cela marche sur les anciennes. sur 5.0, ca marche impec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     
    SELECT ID, CLI, CLA, NOM, max(DUREE), DATE, NB, VAL, TYPE 
    FROM TABLE 
    WHERE DUREE>36000 AND NOM like '$nom'
    GROUP BY DUREE desc limit 1

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par jota5450
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, CLI, CLA, NOM, max(DUREE), DATE, NB, VAL, TYPE 
    FROM TABLE 
    WHERE DUREE>36000 AND NOM like '$nom'
    GROUP BY DUREE desc limit 1
    SELECT MAX(DUREE) ET GROUP BY DUREE ??

    Je doute très fortement que le résultat soit celui attendu...

    de plus, c'est quoi ce DESC après un GROUP BY ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    corrige moi si je me trompe.....


    select max(duree) --- te renvoie une ligne (le valeur max),

    select max(duree) ... group by duree desc, va te renvoyer plusieur lignes, agrouper par "duree",


    limit 1, .......


    alors si a une valeur max de duree, il peut avoir des diferentes valeurs de cli et cla, ca depand si il veut la premiere occurence ou la derniere.

    si il veut la premiere, le code que j´ai mis functione. (je viens de le tester)

    si il veut la derniere,
    il devrait avoir encore en plus, "group by duree desc, cli desc, cla desc"


    mais je sais pas si mon mysql est diferent...

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    SELECT max(duree) ... GROUP BY duree

    selectionne la duree max en groupant par duree, c'est à dire que pour chaque valeur de duree, il calcul un nouveau max sur les valeurs de duree correspondantes...

    tu vois l'incohérence ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    je viens de passer la derniere demi heure a faire des testes, et c´est vraie, que le max est en trop....


    dans le groupe by, si on met les colonnes qui peuvent avoir des valeurs diferents, on arrive a faire un filtre., et ca evite le probleme initiale de rdams. et ca evite ta solution si on a pas Mysql > 4.1

    ptite question.

    comment interprete tu la question de rdams?
    il veut une seulement une ligne de retour (la ligne ou est la valeur max de duree), ou il veut plusieurs ligne de retour?

    son code en renvoie plusieur, comme le tien d´ailleurs. ce qui revient au meme. le max n´est pas necessaire.

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    plusieurs, le problème avec sa requête, c'est qu'en dehors des champs utilisés pour le GROUP BY et pour les valeurs agrégées (en l'occurence le MAX), il est impossible de savoir quelle valeur sera prise en compte parmis toutes celles possibles... ce ne sera pas forcément celles correspondant à la plus grand durée...

    alors qu'avec la sous-requête on en est assuré
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Merci pour vos réponses, j'ai utilisée les deux requêtes de Swoög car j'utilise une version antérieur à la 4.1

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/05/2014, 14h16
  2. Réponses: 0
    Dernier message: 08/05/2012, 12h51
  3. Selectionner une ligne avec un max sur plusieurs critères
    Par achestyx dans le forum Développement
    Réponses: 2
    Dernier message: 31/03/2011, 10h53
  4. Problème de selection d'une ligne avec !
    Par aalex_38 dans le forum VBA Word
    Réponses: 4
    Dernier message: 11/09/2009, 10h18
  5. Réponses: 3
    Dernier message: 06/11/2007, 11h16

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