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

MySQL Discussion :

Problème de tri en évitant les doublons ORDER + GROUP


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut Problème de tri en évitant les doublons ORDER + GROUP
    Bonjour,

    Je coince dans ma requête sql afin de ne conserver de ma base que les éléments triés par date (colonne date) et sans doublon de projet (colonne id_projet) quand initiale = STS


    Ma base est nommée "pointage_projet"

    | id  | initiale |      date    |  id_projet   |   minutes   |   remarque   |
    ===========================================
    |17  |    MC   | 2016-03-30|      61        |     490       |                   |
    |44  |    VJ     | 2016-03-31|       5       |      157      |                   |
    |154 |    STS  | 2016-03-30|      2        |      60       |                   |
    |153 |  STS    | 2017-01-04|      2        |      15       |                   |
    |2    |    JPC   | 2016-03-30|      61      |     490       |                   |
    |151 |  STS    | 2017-01-04|      12        |      15       |                   |
    |155 |  STS    | 2017-01-10|      2        |      115       |                   |
    |156 |  STS    | 2017-01-12|      55        |      160       |                   |
    Je souhaite trouver les 3 derniers projets pointés en éliminant les doublons (je n'arrive pas à associer correctement ORDER & GROUP)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT j.id_projet, j.date
    FROM `pointage_projet` as j
    WHERE j.initiale = 'STS'
    GROUP BY id_projet
    ORDER BY j.id DESC
    LIMIT 3
    La requête ci-dessus est incorrecte et je ne trouve pas la solution.

    Je souhaite ce résultat

    |  id_projet   |   date   | 
    ================
    |     55     |  2017-01-12|
    |     2      |  2017-01-10|
    |     12      |  2017-01-04|
    Pouvez-vous m'aider ?

    D'avance merci

    Steph

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut morpheus.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`        integer unsigned not null auto_increment primary key,
      `initiale`  char(03)         not null,
      `date`      date             not null,
      `id_projet` integer unsigned not null,
      `minute`    integer unsigned not null,
      `remarque`  varchar(255)     not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`id`,`initiale`,`date`,`id_projet`,`minute`,`remarque`) values
    (17,  'MC',  '2016-03-30', 61,  490, ''),
    (44,  'VJ',  '2016-03-31',  5,  157, ''),
    (154, 'STS', '2016-03-30',  2,  60,  ''),
    (153, 'STS', '2017-01-04',  2,  15,  ''),
    (2,   'JPC', '2016-03-30', 61,  490, ''),
    (151, 'STS', '2017-01-04', 12,  15,  ''),
    (155, 'STS', '2017-01-10',  2,  115, ''),
    (156, 'STS', '2017-01-12', 55,  160, '')
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----+----------+------------+-----------+--------+----------+
    | id  | initiale | date       | id_projet | minute | remarque |
    +-----+----------+------------+-----------+--------+----------+
    |   2 | JPC      | 2016-03-30 |        61 |    490 |          |
    |  17 | MC       | 2016-03-30 |        61 |    490 |          |
    |  44 | VJ       | 2016-03-31 |         5 |    157 |          |
    | 151 | STS      | 2017-01-04 |        12 |     15 |          |
    | 153 | STS      | 2017-01-04 |         2 |     15 |          |
    | 154 | STS      | 2016-03-30 |         2 |     60 |          |
    | 155 | STS      | 2017-01-10 |         2 |    115 |          |
    | 156 | STS      | 2017-01-12 |        55 |    160 |          |
    +-----+----------+------------+-----------+--------+----------+
    --------------
    select    date,
              any_value(id_projet) as id_projet
        from  test
       where  initiale = 'STS'
    group by  date
    order by  date desc
       limit  3
    --------------
     
    +------------+-----------+
    | date       | id_projet |
    +------------+-----------+
    | 2017-01-12 |        55 |
    | 2017-01-10 |         2 |
    | 2017-01-04 |        12 |
    +------------+-----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    --> http://cedric-duprez.developpez.com/...fier-group-by/
    --> http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    --> https://dev.mysql.com/doc/refman/5.7...modifiers.html

    @+

  3. #3
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    #1305 - FUNCTION pointage.ANY_VALUE does not exist

    ANY_VALUE, si je comprends bien est disponible depuis MYSQL 5.7 ?

    Ca ne fonctionne pas avec ma version, y a t'il yne autre solution sans ANY_VALUE ?

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut Morpheus.

    Dans quelle version MySql êtes-vous ?

    Pour les versions inférieures à MtSql 5.7., ne mettez pas la fonction "any_value()'

    @+

  5. #5
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    Version de Mysql

    Variable_name Value
    innodb_version 5.5.43-MariaDB-37.2
    protocol_version 10
    slave_type_conversions
    version 5.5.44-MariaDB-log
    version_comment MariaDB Server
    version_compile_machine i686
    version_compile_os Linux

  6. #6
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    C'est un serveur interne à notre entreprise,
    pensez-vous que je puisse passer à la version 5.7 sans perdre des données dans mes bases ni créer de soucis dans les codes existants ?

    Merci pour votre aide

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut Morpheus.

    Vous n'utilisez pas le SGBDR "MySql" mais le SGBDR "MariaDB", qui est plus performant.
    La prochaine fois, indiquez dans le titre de votre sujet, la version que vous utilisez !

    Si vous savez comment migrer vers la dernière version MariaDB, faites le !
    La version "10.1.20-MariaDB" est la dernière version stable.
    --> https://downloads.mariadb.org/mariadb/10.1.20/

    Mais avant de changer la version de votre SGBDR, vous devez faire une sauvegarde de toutes vos bases de données.
    Récupérer aussi le fichier "my.ini" (my.cnf sous linux).

    MariaDB ne possède pas la fonction "any_value()".

    @+

  8. #8
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    Salut Artemus24,

    Je vais essayer de faire ça mais dans le cas où je ne sais pas mettre à jour MariaDB sur notre serveur qui est un Qnap QST439 pro, y a t'il une autre solution pour résoudre ce problème sans cette fonction ?

    Le problème c'est qu'on ne sais pas inverser la fonction GROUP avec le tri ORDER. N'y a t'il pas moyen de faire une base de donnée temporaire avec le tri ORDER puis de faire le GROUP après ?

    Désolé mais je débute en SQL ;-)

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut Morpheus.

    Dans le message #4, je vous ai indiqué de ne pas mettre cette fonction. Faites 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    --------------
    SHOW VARIABLES LIKE '%version%'
    --------------
     
    +-------------------------+---------------------------------+
    | Variable_name           | Value                           |
    +-------------------------+---------------------------------+
    | innodb_version          | 5.6.34-79.1                     |
    | protocol_version        | 10                              |
    | slave_type_conversions  |                                 |
    | version                 | 10.1.20-MariaDB                 |
    | version_comment         | mariadb.org binary distribution |
    | version_compile_machine | x64                             |
    | version_compile_os      | Win64                           |
    | version_malloc_library  | system                          |
    | version_ssl_library     | YaSSL 2.4.2                     |
    +-------------------------+---------------------------------+
    --------------
    select    date, id_projet
        from  test
       where  initiale = 'STS'
    group by  date
    order by  date desc
       limit  3
    --------------
     
    +------------+-----------+
    | date       | id_projet |
    +------------+-----------+
    | 2017-01-12 |        55 |
    | 2017-01-10 |         2 |
    | 2017-01-04 |        12 |
    +------------+-----------+
    @+

  10. #10
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    GROUP BY date
    me donne plusieurs fois le même projet, je suppose que vous vouliez mettre GROUP BY id_projet

    mais en faisant cela, c'est incorrect aussi car il supprime les projets identiques sans les avoir trier par date avant donc il me supprime parfois des projets récents qui sont des doublons et ma liste des 3 projets les plus récents n'est pas correct.

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut Morpheus.

    J'ai répondu à la question de votre premier message, à savoir reproduire le résultat que vous attendiez.

    Si vous désirez inclure aussi les "projets" dans votre critères, alors voici une autre solution qui produit aussi le même résultat :
    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
    --------------
    select    date, id_projet
        from  test
       where  initiale = 'STS'
    group by  date ,     id_projet
    order by  date desc, id_projet desc
       limit  3
    --------------
     
    +------------+-----------+
    | date       | id_projet |
    +------------+-----------+
    | 2017-01-12 |        55 |
    | 2017-01-10 |         2 |
    | 2017-01-04 |        12 |
    +------------+-----------+
    @+

  12. #12
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    En effet, avec les données que je vous ai donné au départ (donnée écrite au hasard)

    Ajouter cette ligne dans la base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `pointage`.`test` (`id`, `initiale`, `date`, `id_projet`, `minute`, `remarque`) VALUES (NULL, 'STS', '2017-01-11', '2', '55', '');
    Vous aurez comme résultat:

    date id_projet
    2017-01-12 55
    2017-01-11 2
    2017-01-10 2

    Et je ne souhaite pas de doublon dans la colonne id_projet

    Merci beaucoup pour votre aide précieuse ;-)

  13. #13
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Salut morpheuss.

    J'ai rajouté la ligne supplémentaire et voici le nouveau résultat :
    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
    --------------
    select    id_projet, date
        from  test as t1
       where  date = (
     
        select  max(date) as date
          from  test as t2
         where  t2.id_projet = t1.id_projet
           and  initiale     = 'STS'
     
    )
         and  initiale = 'STS'
    group by  id_projet
    order by  date desc
    --------------
     
    +-----------+------------+
    | id_projet | date       |
    +-----------+------------+
    |        55 | 2017-01-12 |
    |         2 | 2017-01-11 |
    |        12 | 2017-01-04 |
    +-----------+------------+
    @+

  14. #14
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    Whaww super c'est bien ce que je souhaitais.

    Trop fort.

    MERCI Artemus

    Bon WE

  15. #15
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    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 914
    Par défaut
    Bon week-end aussi !

    Mettez votre sujet à résolu.

    @+

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  2. [WD11] Remplir une liste en évitant les doublons
    Par hanitax dans le forum WinDev
    Réponses: 0
    Dernier message: 08/01/2012, 16h16
  3. Mise à jour d'enregistrement en évitant les doublons
    Par michel67000 dans le forum Requêtes
    Réponses: 9
    Dernier message: 09/11/2010, 23h12
  4. Recherche de valeur évitant les doublons
    Par Jimy6000 dans le forum Excel
    Réponses: 3
    Dernier message: 04/04/2010, 11h21
  5. Regroupement évitant les doublons
    Par vinz945 dans le forum Deski
    Réponses: 1
    Dernier message: 30/04/2008, 13h11

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