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 :

Problème avec "MAX"


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Problème avec "MAX"
    Bonjour,

    J'ai une base de données relativement grosse (100 000 enregistrement), ou un enregistrement correspond a un test pour un individu (resultat = 1,2,3) je peux donc avoir plusieurs fois un individu dans cette base, la base contient également la date du Test

    Je cherche a trouver le résultat max du test pour chaque individu (s'il en a fait 2 avec pour résultat 1,3 je vais donc extraire la ligne correspondant au 3

    Facile pour le moment

    Il peut arriver qu'un individu est 2 fois le même résultat (2 et 2 par exemple) et dans ce cas la je vais prendre le test le plus récent

    j'ai donc créer une table dans laquelle j'ai inséré les valeurs max pour chaque individu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO Table_Test (Individu, resultat, date) 
    SELECT INDIVIDU, DATE_TEST, MAX(Resultat_test)
    Le problème c'est que "max" me renverra le premier résultat le plus grand sans prendre en compte la date

    Ya-t-il un moyen avec max ou une autre fonction de sélectionner tous les maximum et pas seulement le premier maximum?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Il faut d'abord chercher le MAX(Resultat_test) pour chaque individu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT INDIVIDU, MAX(Resultat_test) AS TestMax
    FROM tatable
    GROUP BY INDIVIDU
    Ensuite chercher la date max ayant le max test pour chaque individu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t.INDIVIDU, tmp.TestMax, MAX(t.DATE_TEST)
    FROM tatable t
    INNER JOIN (
      SELECT INDIVIDU, MAX(Resultat_test) AS TestMax
       FROM tatable
       GROUP BY INDIVIDU
    ) tmp ON t.INDIVIDU = tmp.INDIVIDU
       AND t.Resultat_test = tmp.TestMax
    GROUP BY t.INDIVIDU, tmp.TestMax

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    En fait en cherchant le max en premier il va prendre la première valeur peu importe la date si je me retrouve avec un max ou il y a 2 valeurs identiques

    Au final j'aurais pu réfléchir un peu plus puisque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO Table_Test (Individu, resultat, date) 
    SELECT INDIVIDU, MAX(Resultat_test), MAX(Date_Test
    ca a l'air de fonctionner

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Notoirement il manque qqe chose dans la requête SELECT, notamment la clause de filtrage WHERE sur l'individu.
    D'autre part associer MAX(Resultat_test) et MAX(Date_Test) dans le même groupage sous-jacent c'est affirmé que la date la plus récente d'un test pour un individu correspond forcément à sa valeur maximale de résultat.
    Cela correspond peut-être à la situation, mais peut-être pas.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    C'est vrai que ca marche pas pourtant j'avais tester

    Merci

    Je vais tester la solution de CinePhil

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Il faut d'abord chercher le MAX(Resultat_test) pour chaque individu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT INDIVIDU, MAX(Resultat_test) AS TestMax
    FROM tatable
    GROUP BY INDIVIDU
    Ensuite chercher la date max ayant le max test pour chaque individu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t.INDIVIDU, tmp.TestMax, MAX(t.DATE_TEST)
    FROM tatable t
    INNER JOIN (
      SELECT INDIVIDU, MAX(Resultat_test) AS TestMax
       FROM tatable
       GROUP BY INDIVIDU
    ) tmp ON t.INDIVIDU = tmp.INDIVIDU
       AND t.Resultat_test = tmp.TestMax
    GROUP BY t.INDIVIDU, tmp.TestMax
    Hello
    J'ai essayé ta requête, quand je fait ca sur un échantillon de ma base qui ne contient pas de "max double" ca me l'execute en moins d'une seconde, quand il y a un "max double" le serveur réfléchis une plombe et même après 1h pas de résultats

Discussions similaires

  1. [Shell] Problème avec le Back-quote (ksh)
    Par bob94700 dans le forum Linux
    Réponses: 3
    Dernier message: 27/01/2008, 13h45
  2. Sudo problème avec les simples quotes
    Par Tronche dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/03/2007, 13h02
  3. [MySQL] Problème avec un double quote
    Par wormseric dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2007, 15h44

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