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 :

Fonction Access Last en SQL - group with text free field


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2014
    Messages : 28
    Points : 31
    Points
    31
    Par défaut Fonction Access Last en SQL - group with text free field
    Hello

    Je bloque sur un sacré probleme SQL qu'MS Access réalise sans probléme via une fonction interne LAST - qui n existe pas en SQL.

    Donc j'ai une table DISCUSSIONS avec 4 champs
    - Discussion = id de la discussion
    - Commentaire = id du commentaire - chaque discussion ayant plusieurs commentaires
    - Date = date du commentaire
    - Txt = le texte du commentaire

    L'objectif est de crée une table qui contient les 4 champs mais uniquement le dernier commentaire de chaque discussion.
    Par exemple sur les premiers enregistrements ci-dessous, l'objectif est de ne sélectionner que ce qui est surligné en vert:

    Nom : 989966table.jpg
Affichages : 130
Taille : 30,1 Ko
    Blague inside - vous remarquerez que les mecs ont pas un vocabulaire très élaboré
    Bon trêve de plaisanteries, avec Access, cela prend 1 minute, il suffit d'utiliser la fonction interne LAST et de l'appliquer a tous les champs sauf l'ID de la discussion qu'on groupe.

    Nom : 192863query.jpg
Affichages : 124
Taille : 23,2 Ko


    Maintenant comment faire en SQL ?!!!

    On a diverses pistes avec select top1 d'une sous table, ou avec max qui peut remplacer last

    Mais a chaque fois le problème c'est de rapatrier le champ Txt sur lequel on ne peut pas faire de regroupement sous peine de se retrouver avec plusieurs entrées par discussion vu que chaque commentaire est différent....

    Quelqu'un aurait il une solution ?

    Voici un échantillon maquillé de la table si certain veulent tester:

    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
    27
    28
    29
    30
    31
    Discussion	Commentaire	Date	Txt
    5121624	10528551	03/08/2015	!15
    5115202	10512847	31/07/2015	!15
    5115202	10515924	21/07/2015	!ed
    5109022	10512723	31/07/2015	!e.
    5105199	10491278	28/07/2015	!ul
    5102347	10528278	03/08/2015	!15
    5096132	10465807	24/07/2015	!40
    5096132	10491082	28/07/2015	!ul
    5096048	10468303	24/07/2015	!n.
    5093189	10450602	22/07/2015	!OZ
    5093189	10468872	24/07/2015	!re
    5092970	10452443	22/07/2015	!d.
    5092970	10491044	28/07/2015	!ul
    5090356	10537706	04/08/2015	!p.
    5086841	10468871	24/07/2015	!r.
    5086515	10451717	22/07/2015	!57
    5086515	10465768	24/07/2015	Ak.
    5086515	10522173	02/08/2015	!ss
    5086487	10450301	22/07/2015	!OZ
    5086211	10515918	31/07/2015	!ed
    5081965	10515909	31/07/2015	!ed
    5081642	10465872	24/07/2015	!DD
    5081642	10514454	31/07/2015	!ed
    5074566	10505236	30/07/2015	!ed
    5072378	10522171	02/08/2015	!ss
    5071086	10451962	22/07/2015	!4.
    5071086	10460145	23/07/2015	!n.
    5071086	10465307	24/07/2015	!n.
    5071086	10466872	24/07/2015	!st
    5061729	10409529	15/07/2015	Ded
    Je vous remercie d avance pour 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 803
    Points
    30 803
    Par défaut
    Une petite recherche dans ce forum te permettrait de découvrir que cette question est très régulièrement résolue
    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
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2014
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    J'ai pas mal cherché et rien trouvé.
    As tu des mots clés à me conseiller ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre SGBD est bien MS SQL-Server ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2014
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    C'est une base d'un progiciel, je m'y connecte avec les drivers MySQL Connector puis je query avec Access et MySQL Workbench

  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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Essayez comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select dis.discussion
          ,com.commentaire
          ,com.date  
          ,com.txt
    from discussion dis
    inner join commentaire com
       on com.discussion = dis.discussion
    where com.date =
         (select max(date) 
          from commentaire as subq
          where subq.discussion = com.discussion
            and subq.commentaire= com.commentaire)
    J'imagine que la date du commentaire est bien dans la table commentaires et non dans la table discussion comme indiqué dans le tableau, j'ai en tout cas construit la requête en ce sens.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2014
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    Hello
    Merci pour la réponse.
    Dans mon exemple il n'y a bien qu'une table comme indiqué - donc pas besoin de jointure.
    Je vais quand même essayer de m'inspirer de ton code.

    Apres réflexion, je suis incapable de m'inspirer de ton code, tu manipule des objets qui ne faisaient pas partie de l’énoncé
    Je suis sur que ça me sera utile plus tard, mais pour l'instant repartons de mon exemple qui est simplifié : une table et un type de tri a effectuer : trouver le dernier commentaire de chaque discussion.

  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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Désolé j'avais cru voir 2 tables, ma vue baisse

    voici une nouvelle version de requête, plus simple du coup puisque sur une seule table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select discussion
          ,commentaire
          ,date  
          ,txt
    from discussion as main
    where date =
         (select max(date) 
          from discussion as subq
          where subq.discussion = main.discussion
            and subq.commentaire= main.commentaire)

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre requête ne donnera pas le bon résultat escartfigue, il faut enlever le commentaire dans la jointure.
    Par contre, question performance écrite de cette façon ça risque de mouliner.

    Il vaut mieux l'écrire de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select t1.discussion
         , t1.commentaire
         , t1.date  
         , t1.txt
      from discussion           as t1
      join ( select discussion
                  , max(date)   as dt_max
               from discussion
           group by discussion) as t2  on t2.discussion = t1.discussion
                                      and t2.dt_max     = t1.date;

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2014
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    Hello
    La réponse d'Escartefigue ne fonctionne pas, 2 commentaire differents = 2 entrées dans la table finale
    Waldar je teste la tienne demain.
    Merci

  11. #11
    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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Oui pardon, j'ai oublié d'enlever un critère du where, faites comme ci dessous, vous aurez bien le dernier commentaire de la discussion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select discussion
          ,commentaire
          ,date  
          ,txt
    from discussion as main
    where date =
         (select max(date) 
          from discussion as subq
          where subq.discussion = main.discussion)

  12. #12
    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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Votre requête ne donnera pas le bon résultat escartfigue, il faut enlever le commentaire dans la jointure.
    Par contre, question performance écrite de cette façon ça risque de mouliner.

    Il vaut mieux l'écrire de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select t1.discussion
         , t1.commentaire
         , t1.date  
         , t1.txt
      from discussion           as t1
      join ( select discussion
                  , max(date)   as dt_max
               from discussion
           group by discussion) as t2  on t2.discussion = t1.discussion
                                      and t2.dt_max     = t1.date;
    Oui j'ai vu, oublié d'enlever un critère puisque finalement il n'y a qu'une table, par contre le group by peut consommer aussi, en fait tout dépend des stats, à comparer pour en avoir le coeur net

  13. #13
    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 803
    Points
    30 803
    Par défaut
    Il manque la troisième méthode de résolution du problème, avec EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  discussion
        ,   commentaire
        ,   date  
        ,   txt
    FROM    discussion  AS main
    WHERE   EXISTS          
            (   SELECT  NULL 
                FROM    discussion  AS subq
                WHERE   main.discussion = subq.discussion
                HAVING  main.date       = MAX(subq.date)
            )
    ;
    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.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2014
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Oui j'ai vu, oublié d'enlever un critère puisque finalement il n'y a qu'une table, par contre le group by peut consommer aussi, en fait tout dépend des stats, à comparer pour en avoir le coeur net

    Super, ca marche, merci Escartefigue

    Al1_24 merci pour ta réponse je testerai a l'occasion.

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

Discussions similaires

  1. fonctions ACCESS en mode SQL
    Par ARFAOUI1953 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/04/2013, 16h09
  2. fonction VBA dans du SQL access
    Par kapotocho dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 18/03/2008, 16h15
  3. [Access] Requète SQL Group By, Order By and Co
    Par zoidy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/06/2006, 14h37
  4. [SQL Serv2000][Indexation Texte Integral]Choix menu grisé
    Par TreizeSegments dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 09h21
  5. fonction qui initialise a blanc zone de texte
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/11/2003, 16h36

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