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 :

Selection d' items sur date la plus recente [MySQL-5.6]


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 16
    Points
    16
    Par défaut Selection d' items sur date la plus recente
    bonjour à tous,

    je débute sur SQL et je n'arrive pas à sélectionner uniquement les items dont la date est la plus récente dans la requete suivante:

    SELECT
    sacoche_user.user_sconet_elenoet,
    sacoche_user.user_nom,
    sacoche_user.user_prenom,
    sacoche_groupe.groupe_nom,
    sacoche_referentiel_item.item_id,
    sacoche_referentiel_item.item_nom,
    sacoche_saisie.saisie_note,
    sacoche_saisie.saisie_date

    FROM sacoche_referentiel_item, sacoche_saisie, sacoche_user, sacoche_groupe

    WHERE sacoche_saisie.eleve_id = sacoche_user.user_id

    AND sacoche_groupe.groupe_id = sacoche_user.eleve_classe_id

    AND sacoche_referentiel_item.item_id = sacoche_saisie.item_id

    AND sacoche_referentiel_item.item_id > 100

    AND sacoche_referentiel_item.item_id < 234

    AND sacoche_user.user_sconet_elenoet != 0

    ORDER BY
    sacoche_groupe.groupe_nom,sacoche_user.user_nom,sacoche_user.user_prenom,sacoche_referentiel_item.item_id


    Nom : Capture.PNG
Affichages : 152
Taille : 19,5 Ko

    voici le résultat on remarque que l'item 129 apparait deux fois ,je voudrais ne sélectionner que les items dont la date est la plus récente en conservant
    la mise en forme actuelle de la table

    j'ai essayé avec un select MAX cela ne retourne qu'un seul item...

    merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut ysarius.

    Citation Envoyé par ysarius
    je voudrais ne sélectionner que les items dont la date est la plus récente en conservant la mise en forme actuelle de la table
    Je vous explique la méthode et c'est à vous de l'adapter à votre requête.
    La méthode intuitive pour sélectionner une ligne ayant la plus grande date est de faire une sous-requête corrélée. Le mieux est de donner un exemple.

    Soit une table ayant
    --> un identifiant : 'id'
    --> une date : 'date'
    --> une valeur : 'val'.

    Dans cette table, il y a plusieurs valeurs identiques, et vous désirez récupérer que celle à la date la plus récente.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    id   date         val
    --   ----         ---
    1    2015-11-01   1
    2    2015-11-02   1
    3    2015-11-03   1
    4    2015-11-03   2
    5    2015-11-04   2
    6    2015-11-05   2
    7    2015-11-05   3
    8    2015-11-06   3
    Selon ces résultats, vous désirez obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    id   date         val
    --   ----         ---
    3    2015-11-03   1
    6    2015-11-05   2
    8    2015-11-06   3
    Le critère est que pour une valeur donnée, il suffit de sélectionner la plus grande date.
    Voici la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select id, date, val
    from ma_table as tb1
    where date = (
        select max(date)
        from ma_table as tb2
        where tb2.val = tb1.val);
    Dans la première partie de la requête, on sélectionne toutes les lignes.
    L'astuce ensuite est de dire (dans la clause where) que je désire conserver que celles qui ont la date égale à ce que va ma retrouner ma sous-requête.
    Une sous-requête, c'est une requête qui est imbriquée dans une autre requête.
    Pour ce faire, je sélectionne la plus grande date. Oui, mais comment ?

    En faisant une corrélation avec la requête principale sur la colonne 'val', puisque c'est cette colonne qui admet des doublons.
    J'ai fait un lien en utilisant l'alias ('as') entre la requête principale ('tb1') et la sous-requête ('tb2').
    C'est ce lien qui va me permettre de prendre la plus grande date, non pas sur la totalité de la table, mais uniquement sur le groupe de ligne ayant la même valeur pour la colonne 'val'.

    Bon, j'espère que vous avez compris comment procéder.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 16
    Points
    16
    Par défaut
    merci pour la reponse artemus24,

    j'ai essayé la requête mais cela ne correspond pas à ce que je souhaite

    j'ai du louper des étapes...


    j'ai une table qui s'appelle sacoche_saisie qui contient les éléments suivants
    Nom : Capture2.PNG
Affichages : 176
Taille : 18,1 Ko

    j'ai effectué d'après ta solution cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select eleve_id,item_id,saisie_note,saisie_date
    from sacoche_saisie as tb1
    where saisie_date = (
        select max(saisie_date)
        from sacoche_saisie as tb2
        where tb2.item_id = tb1.item_id)
    ORDER BY eleve_id,item_id
    ;
    voici le résultat obtenu
    Nom : Capture3.PNG
Affichages : 152
Taille : 11,8 Ko
    comme on peut le voir le résultat de la requête, retourne 10 item pour l’élève_id 78 alors qu'il y'en a plus de 40

    ce que je voudrai c'est obtenir une seule occurrence d'"item_id"(la plus récente) par "élève_id"

    merci beaucoup

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par ysarius Voir le message
    j'ai essayé la requête mais cela ne correspond pas à ce que je souhaite

    j'ai du louper des étapes...
    C'est normal, si vous voulez la date maxi par élève, il faut faire la jointure sur l'identifiant élève :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select eleve_id, item_id, saisie_note, saisie_date
    from sacoche_saisie as tb1
    where saisie_date = (
        select max(saisie_date)
        from sacoche_saisie as tb2
        where tb2.eleve_id = tb1.eleve_id)
    ORDER BY eleve_id,item_id
    ;

  5. #5
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 16
    Points
    16
    Par défaut
    merci pour ta reponse escartefigue,

    Il y a cependant un soucis dans la requête... les items ne possédant qu'une seule évaluation ne sont plus affichés

    Nom : Capture5.PNG
Affichages : 144
Taille : 7,0 Ko

    que faire pour qu'il soit pris en compte dans la requête?

    merci encore pour votre aide

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Je ne comprends pas, pouvez vous communiquer le jeu d'essai en entrée et aussi et surtout un exemple de résultat attendu comportant quelques cas différents

    Car pour moi, la requete que j'ai postée plus haut correspond bien à
    Citation Envoyé par ysarius Voir le message
    ce que je voudrai c'est obtenir une seule occurrence d'"item_id"(la plus récente) par "élève_id"
    Un éleve ne doit donc apparaitre qu'une seule fois, avec une ligne portant le n° d'item et la note correspondants à la date la plus récente

  7. #7
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre participation Escartefigue
    contenu de la table brut sacoche_saisie
    Nom : Capture6.PNG
Affichages : 143
Taille : 18,9 Ko

    voici ma table mise en forme avec la requête suivante (trié pour les item_id 101 à 233)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    select eleve_id, item_id, saisie_note, saisie_date
    from sacoche_saisie
        AND item_id >100
        AND item_id<234
        ORDER BY eleve_id,item_id
    eleve_id	item_id	saisie_note	saisie_date
    78	101	4	22/09/14
    78	102	3	20/05/15
    78	103	2	20/05/15
    78	104	2	20/05/15
    78	105	4	29/09/14
    78	106	4	29/09/14
    78	107	4	29/09/14
    78	108	4	29/09/14
    78	109	4	29/09/14
    78	110	3	08/10/14
    78	113	3	06/10/14
    78	120	2	03/02/15
    78	121	3	03/02/15
    78	122	3	03/02/15
    78	124	2	03/02/15
    78	126	2	03/02/15
    78	128	3	03/02/15
    78	129	3	03/02/15
    78	129	4	16/09/15
    78	130	3	16/09/15
    on remarque que pour 'eleve_id' 78 j'ai deux évaluations pour 'item_id' 129

    en appliquant votre requête j'obtiens
    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 eleve_id, item_id, saisie_note, saisie_date
    from sacoche_saisie as tb1
    where saisie_date = (
        select max(saisie_date)
        from sacoche_saisie as tb2
        where tb2.eleve_id = tb1.eleve_id)
        AND item_id >100
        AND item_id<234
        ORDER BY eleve_id,item_id
    eleve_id	item_id	saisie_note	saisie_date
    78	129	4	16/09/15
    78	130	3	16/09/15
    78	131	3	16/09/15
    78	139	2	16/09/15
    on remarquei qu'il manque les item_id 101 à 126


    ce que je souhaite obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    eleve_id	item_id	saisie_note	saisie_date
    78	101	4	22/09/14
    78	102	3	20/05/15
    78	103	2	20/05/15
    78	104	2	20/05/15
    78	105	4	29/09/14
    78	106	4	29/09/14
    78	107	4	29/09/14
    78	108	4	29/09/14
    78	109	4	29/09/14
    78	110	3	08/10/14
    78	113	3	06/10/14
    78	120	2	03/02/15
    78	121	3	03/02/15
    78	122	3	03/02/15
    78	124	2	03/02/15
    78	126	2	03/02/15
    78	128	3	03/02/15
    78	129	3	03/02/15
    78	130	3	16/09/15
    l'item_id 129 qui apparaissait deux fois n’apparaît qu'une seule fois !

    j’espère avoir répondu à vos interrogations !

    merci

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    En ce cas, vous voulez une réponse par couple (éleve-id; item-id) soit la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select eleve_id, item_id, saisie_note, saisie_date
    from sacoche_saisie as tb1
    where saisie_date = (
        select max(saisie_date)
        from sacoche_saisie as tb2
        where tb2.eleve_id = tb1.eleve_id
          and tb2.item_id  = tb1.item_id)
    ORDER BY eleve_id,item_id

  9. #9
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 16
    Points
    16
    Par défaut
    c'est exactement ce que je souhaitais

    un grand merci pour votre aide ESCARTEFIGUE


    je passe le sujet en résolu!

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

Discussions similaires

  1. select avec group by sur la date la plus recente
    Par maysa dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/07/2010, 12h02
  2. [HQL] recuperer l'objet avec la date la plus recente
    Par snopims dans le forum Hibernate
    Réponses: 6
    Dernier message: 09/01/2009, 10h32
  3. retrouver la date la plus recente sous excel
    Par emelfr dans le forum Excel
    Réponses: 2
    Dernier message: 19/10/2008, 18h24
  4. Requete:le moyen de selectionner la date la plus recente
    Par vincefop dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 11/08/2008, 10h05
  5. Comment choisir la date la plus recente
    Par eown dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/04/2006, 17h39

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