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 :

Sous requêtes : plusieurs "max" dans une liste


Sujet :

Requêtes MySQL

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut Sous requêtes : plusieurs "max" dans une liste
    Bonjour,

    Je m'excuse pour le titre du message, je ne savais pas comment le présenter. Je le modifie sur vos suggestions si vous le voulez. Merci.

    Voici un extrait du résultat d'une requête :

    Nom : avs.jpg
Affichages : 68
Taille : 65,2 Ko

    je voudrais ne garder que la ligne qui contient le num_contrat le plus élevé pour chaque id_avs.
    Exemple pour Catherine (id_avs = 2), je voudrais : 2, Catherine, 00/00/000, 5

    Évidemment, si je fais un GROUP BY sur id_avs, j'ai bien une seul ligne, mais pas forcément le num_contrat le plus élevé.

    Je suis parti sur l'idée d'une sous requête mais je n'arrive pas à la formuler correctement.
    Voici la requête qui renvoie l'extrait de l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT avs.id_avs, nom_usage_avs, prenom_avs, DATE_FORMAT(contrat.date_fin_contrat, '%d/%m/%Y') AS fin, contrat.num_contrat
     
    FROM `signe_contrat` AS C1
     
    LEFT JOIN `avs`
    	ON C1.id_avs = avs.id_avs
     
    LEFT join `contrat`
    	ON C1.num_contrat = contrat.num_contrat
     
    ORDER BY nom_usage_avs ASC, num_contrat ASC, fin DESC
    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT avs.id_avs, nom_usage_avs, prenom_avs, DATE_FORMAT(contrat.date_fin_contrat, '%d/%m/%Y') AS fin, contrat.num_contrat
    FROM `signe_contrat` AS C1
     
    LEFT JOIN `avs`
    	ON C1.id_avs = avs.id_avs
     
    LEFT join `contrat`
    	ON C1.num_contrat = contrat.num_contrat
     
     
    AND avs.id_avs IN (SELECT avs.id_avs FROM signe_contrat AS C2 WHERE C1.num_contrat = MAX(C2.num_contrat))
     
     
    ORDER BY nom_usage_avs ASC, num_contrat ASC, fin DESC
    mais j'obtiens cette erreur :
    #1111 - Invalid use of group function
    Est-ce que je suis sur la bonne piste ?

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Tu étais parti dans la bonne direction...
    C'est sans doute cela qu'il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    --  AND avs.id_avs IN (SELECT avs.id_avs FROM signe_contrat AS C2 WHERE C1.num_contrat = MAX(C2.num_contrat))
    AND EXISTS
        (   SELECT  NULL
            FROM    signe_contrat   AS C2 
            WHERE   C1.id_avs       = C2.id_avs
            HAVING  C1.num_contrat  = MAX(C2.num_contrat)
        )
    Quant à ton message d'erreur, il te rappelle que les restrictions basées sur une fonction de regroupement ne s'expriment pas dans la clause WHERE mais dans la clause HAVING (à placer entre GROUP BY et ORDER BY)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Merci, cela fonctionne parfaitement, j'ai bien les résultat voulu.
    SVP, pouvez-vous m'éclairez sur le sens de la requête, je n'ai jamais utilisé de .
    Merci

  4. #4
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    Hello !

    la clause EXISTS ne prend pas en compte la parti SELECT de la requete donc tu peux mettre "SELECT NULL" ou "SELECT *" ou "SELECT 1", peut importe le résultat sera le même

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Ok, merci pour la précision !

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

Discussions similaires

  1. Supprimer plusieur fois un élément dans une liste
    Par Dr_Blurp dans le forum Général Python
    Réponses: 5
    Dernier message: 15/06/2014, 17h13
  2. Max-width dans une image sous IE?
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 23/12/2005, 02h04
  3. Problème select MAX(annee) dans une requête
    Par grisounette dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 28/10/2004, 17h36

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