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

Langage SQL Discussion :

Dernières entrées selon un autre champ


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Dernières entrées selon un autre champ
    Bonjour,

    je recherche depuis ce matin comment faire une requête qui me sélectionne toutes les dernières entrées d'une table selon un champ de cette table.

    Je m'explique:

    Soit ma table suivante :
    --------------------------
    service ; date ; saturation
    --------------------------
    76 ; 2009-12-29 ; 1
    91 ; 2009-12-28 ; 0
    91 ; 2009-12-28 ; 1
    91 ; 2009-12-27 ; 0
    76 ; 2009-12-27 ; 0
    75 ; 2009-12-27 ; 0
    75 ; 2009-12-26 ; 1

    Je souhaiterais récupérer les informations suivantes :
    76 ; 2009-12-29 ; 1
    91 ; 2009-12-28 ; 0
    75 ; 2009-12-27 ; 0

    En fait je souhaiterais récupérer toutes les informations des dernières saisies de tous les services.

    J'ai vu pas mal de chose sur des forums qui concernent les dernières entrées "tout court" de chaque table, mais moi ce serait les dernières entrées selon un autre champ.

    Je sèche...

    Merci d'avance...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    C'est une demande assez classique, une méthode parmi d'autres est la jointure :
    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 
           t.service,
           t.date,
           t.saturation
    FROM TaTable t
    JOIN 
           (
            SELECT service, max(date) AS datemax
            FROM TaTable
            GROUP BY service
           ) tmax
    ON tmax.service = t.service
    AND tmax.datemax = t.date
    N'oubliez pas de préciser votre SGBD, certaines solutions utilisant les fonctions analytiques pourraient être plus performantes mais ne sont pas supportées par tous les sgbd.

    Et au passage, si votre colonne s'appelle réellement "date", c'est une mauvaise idée, car c'est un mot réservé du sql.

    EDIT : je viens de voir que vous avez deux fois votre date max pour le service 91, et vous ne gardez que la ligne contenant saturation = 0.
    Quelle est la règle à appliquer?

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Bonjour,

    C'est une demande assez classique, une méthode parmi d'autres est la jointure :
    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 
           t.service,
           t.date,
           t.saturation
    FROM TaTable t
    JOIN 
           (
            SELECT service, max(date) AS datemax
            FROM TaTable
            GROUP BY service
           ) tmax
    ON tmax.service = t.service
    AND tmax.datemax = t.date
    N'oubliez pas de préciser votre SGBD, certaines solutions utilisant les fonctions analytiques pourraient être plus performantes mais ne sont pas supportées par tous les sgbd.

    Et au passage, si votre colonne s'appelle réellement "date", c'est une mauvaise idée, car c'est un mot réservé du sql.

    EDIT : je viens de voir que vous avez deux fois votre date max pour le service 91, et vous ne gardez que la ligne contenant saturation = 0.
    Quelle est la règle à appliquer?
    Merci pour cette réponse rapide.

    J'ai oublié de préciser que j'avais une base de production en mysql 4 et une base de réplication en mysql 5.

    Cette fonction marche en mysql 5 mais pas en mysql 4. Et c'est sur cette dernière dont j'ai besoin de faire ma requête.

    Ne vous inquiétez pas mes colonnes porte en fait les noms suivant: sat_date, sat_onoff, sat_services...

    Concernant la règle à appliquer, on garde la dernière date pour chaque service.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Qu'est-ce qui ne fonctionne pas? Un message d'erreur?

    Pour la règle à appliquer, je parlais du cas ou vous avez deux fois la même date pour un service, mais c'était peut être une faute de frappe :
    91 ; 2009-12-28 ; 0
    91 ; 2009-12-28 ; 1

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Qu'est-ce qui ne fonctionne pas? Un message d'erreur?

    Pour la règle à appliquer, je parlais du cas ou vous avez deux fois la même date pour un service, mais c'était peut être une faute de frappe :
    Oui excusez moi je n'ai pas recopier les heures/minutes/secondes dans mon exemple, mais normalement ce devrait être :

    91 ; 2009-12-28 20:20:21 ; 0
    91 ; 2009-12-28 19:54:32 ; 1

    Voici la requête que j'ai effectué:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 
           t.sat_service,
           t.sat_date,
           t.sat_ONOFF
    FROM tablesaturation t
    JOIN 
           (        SELECT sat_service, max(sat_date) AS datemax
            FROM tablesaturation
            GROUP BY sat_service
           ) tmax
    ON tmax.sat_service = t.sat_service
    AND tmax.datemax = t.sat_date
    sous mysql 5, ça marche nickel, mais sur mysql 4 j'ai une erreur classique de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1064 - oyu have an error in your SQL syntax. Check the manual that corresponds to your MySAL server version for the right syntax to use near 'SELECT sat_service, max(sat_date) AS datemax FROM tabl

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Je n'ai jamais vraiment utilisé MySQL, donc je pourrai difficilement vous en dire plus.
    Vous pouvez toujours regarder du coté des alias, ou essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
           t.sat_service,
           t.sat_date,
           t.sat_ONOFF
    FROM tablesaturation t
    ,
           (SELECT sat_service, max(sat_date) AS datemax
            FROM tablesaturation
            GROUP BY sat_service
           ) tmax
    WHERE tmax.sat_service = t.sat_service
    AND tmax.datemax = t.sat_date

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Je vous remercie d'avoir pris de votre temps pour m'aider ^^

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    On doit en conclure que ça marche ou pas?

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    On doit en conclure que cela ne fonctionne pas sur mysql 4, mais je vais laisser mes recherches de côtés d'ici demain, et faire mes tests sur ma de données de réplication en attendant...

    Je ne peux donc pas encore mettre la balise "résolu"...

  10. #10
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut 4.0 ... 4.1, c'est quand on a changé de Millénaire
    Bonjour,

    Vous êtes en MySQl 4.0 ? Je pense que les grosses différences sont apparues en pleine release de la 4.0 ou 4.1 mais je sais bien que c'était assez étrange. Il aurait pu/du changer le numéro de version plus tôt. Bref, quoiqu'il en soit, la version 5 est plus stable et acceptera plus de choses et en même temps moins de choses car elle est plus robuste également.

    Concernant les jointures, il me semble que l'on doit de toute façon passer par la syntaxe JOIN. Je pensais qu'il n'aimait pas le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... JOIN (SELECT...)
    Mais apparemment on peut faire des

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... JOIN (A JOIN B...)
    L'un n'empêche pas l'autre, me direz-vous.
    Je n'ai pas étudié tout le manuel mais peut-être trouverez-vous des choses intéressantes dans celui-ci.

    Vu que le problème est, nous pouvons le penser fortement, lié à MySQL, je vous conseille d'aller poser la question sur le forum MySQL.

    Bonne chance.

Discussions similaires

  1. [AC-2003] Numérotation automatique d'un champ selon un autre champ
    Par moht66 dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/02/2011, 16h49
  2. Récupérer les dernières entrées selon un champs
    Par beninsky dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2010, 21h34
  3. [AC-2003] Comment rendre champ inaccessible selon réponse autre champs?
    Par Souriane dans le forum IHM
    Réponses: 7
    Dernier message: 27/11/2009, 21h05
  4. Affichage données selon un autre champ : Requête ou VBA?
    Par Noemy23 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/07/2007, 13h13
  5. Réponses: 2
    Dernier message: 31/01/2007, 09h49

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