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 :

2 MAX en cascade


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut 2 MAX en cascade
    Bonjour,

    J'ai une table de ce format là:

    id_log | date | time | id_dp| id_user| id_etat
    ----------------------------------------------------------
    1 | 2009-11-01 | 14:25:45 | 1 | 45 | 1
    2 | 2009-11-02 | 14:25:45 | 2 | 45 | 5
    3 | 2009-11-01 | 14:25:45 | 2 | 12 | 7
    4 | 2009-11-15 | 17:12:17 | 1 | 25 | 8
    5 | 2009-11-01 | 14:25:45 | 2 | 45 | 2
    6 | 2009-11-15 | 16:32:52 | 1 | 17 | 6
    7 | 2009-11-02 | 13:17:28 | 2 | 45 | 5

    J'aimerais retourner la dernière entrée en date (et heure) pour chaque id_dp, ce qui devrait donner dans cet exemple :

    4 | 2009-11-15 | 17:12:17 | 1 | 25 | 8
    2 | 2009-11-02 | 14:25:45 | 2 | 45 | 5

    J'ai essayé pas mal de méthodes et ce qui me semblait le plus proche était çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM 	(
    		SELECT *
    		FROM `gdp_dp_log`
    		WHERE (`gdp_dp_log`.`date` = (select max(`c`.`date`) AS `MAX(date)` from `gdp_dp_log` `C` where (`c`.`id_dp` = `gdp_dp_log`.`id_dp`))) 
    		ORDER BY  `gdp_dp_log`.`id_dp`
    		)D
     
    WHERE (`D`.`heure` = (select max(`D`.`heure`) AS `MAX(heure)` from `D` where (`d`.`id_dp` = `D`.`id_dp`))) 
    ORDER BY  `D`.`id_dp`
    Le problème est que l'alias de table (D) n'est pas reconnu dans la sous-requête.

    Si quelqu'un a une solution à me proposer, je suis preneur.

    Merci d'avance

    MySQL 5.0.51b

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    MySQL permet, si j'ai bien compris, la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select id_log, max(concat(date, ' ', time)), id_dp, id_user, id_etat
        from gdp_dp_log
    group by id_dp
    order by id_dp asc
    A vérifier au niveau de concat avec les différents types.

  3. #3
    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 : 74
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Sauf que, faire un GROUP BY id_dp ne garantit pas que les id_log, id_user et id_etat qui seront associés à chaque max(concat(date, ' ', time) correspondront à ceux effectivement associés à ce couple date et time dans la table.
    Par ailleurs, il est assez maladroit d'utiliser des mots réservés de MySQL (date et time) pour nommer des colonnes.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est bien pourquoi cette syntaxe ne devrait pas être autorisée par le SGBD

    Revenons aux fondamentaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
       gdl.id_log, gdl.date  , gdl.time   ,
       gdl.id_dp , gdl.id_use, gdl.id_etat
    FROM
       gdp_dp_log gdl
       INNER JOIN (  SELECT max(concat(date, ' ', time)) as max_dtime, id_dp
                       FROM gdp_dp_log
                   GROUP BY id_dp ) mdt
         ON mdt.max_dtime = concat(gdl.date, ' ', gdl.time)
        AND mdt.id_dp = gdl.id_dp

  5. #5
    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 067
    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 067
    Par défaut
    Et hop! Un peu de lecture sur pourquoi MySQL autorise une certaine "souplesse" sur le GROUP BY, et comment la supprimer si on le souhaite :
    http://cedric-duprez.developpez.com/...fier-group-by/

    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

  6. #6
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut Résolu par Waldar
    Merci Waldar, ta solution fonctionne parfaitement. J'ai même pu rajouter une condition sur la date dans ton code pour connaitre l'état des DP à une date donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT gdl.id_dp_log, gdl.date, gdl.heure ,gdl.source_consigne, gdl.id_redacteur, gdl.id_valideur, gdl.id_dp, gdl.id_etat
    FROM gdp_dp_log gdl
    INNER JOIN (
        SELECT max(concat(date, ' ', heure)) AS max_dtime, id_dp
        FROM gdp_dp_log
        WHERE `date` < '2009-12-01'
        GROUP BY id_dp 
    ) mdt ON mdt.max_dtime = concat(gdl.date, ' ', gdl.heure) AND mdt.id_dp = gdl.id_dp
    ORDER BY id_dp ASC
    Pour ce qui est du nommage des champs, je suis entièrement d'accord avec vous mais ces noms m'ont été imposés.

    Merci encore à vous

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

Discussions similaires

  1. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38
  2. Max
    Par MASSAKA dans le forum Requêtes
    Réponses: 8
    Dernier message: 14/01/2004, 18h44
  3. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 12h02
  4. opengl et 3dstudio max
    Par maamar dans le forum OpenGL
    Réponses: 3
    Dernier message: 28/09/2002, 21h48
  5. taille max du nom d'un champ
    Par hna dans le forum Paradox
    Réponses: 2
    Dernier message: 28/07/2002, 03h40

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