Group by SQL /MySQL

Résolu
Archeus01 Messages postés 1566 Date d'inscription   Statut Membre Dernière intervention   -  
Archeus01 Messages postés 1566 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai une table, avec un id_unique , un id_utilisateur, une date_creation.
Je veux connaitre l'id_unique et id_uutilisateur avec la datecreation_max par utilisateur, je fais

select max(date_creation), id_ligne, id_utilisateur from table
group by id_utilisateur en MySql (pas testé), ça passe.

Mais en SQL, vu qu'il me dit que id_ligne n'est pas dans la clause group by (et si je la mets, ben j'ai toutes les lignes...), comment dois-je faire?

2 réponses

  1. jee pee Messages postés 31908 Date d'inscription   Statut Modérateur Dernière intervention   9 985
     
    Salut,

    Avec Oracle je ferais un

    select date_creation, id_ligne, id_utilisateur from table
    where (date_creation,id_utilisateur) in 
       (select max(date_creation), id_utilisateur from table
       group by id_utilisateur)


    Cdlt

            un étranger, c'est un ami qu'on n'a pas encore rencontré.
    0
  2. Archeus01 Messages postés 1566 Date d'inscription   Statut Membre Dernière intervention   455
     
    Merci.

    Tel quel, ça ne fonctionnait pas sur SQL Serveur. Mais bon, je m'en suis inspiré. Voici le résultat (et ça fonctionne même si je ne trouve pas que faire une sous-requête soit élégant).

    select R.id_ligne, R.date_creation, from table R
    join
    (select max(date_creation) d, id_utilisateur p from table group by id_utilisateur) as RTEMP
    on RTEMP.p = r.id_utilisateur and RTEMP.d = r.date_creation
    0
    1. jee pee Messages postés 31908 Date d'inscription   Statut Modérateur Dernière intervention   9 985
       
      L'élégance ;-)

      Tu résonnes avec ta connaissance des données dans ta base.

      En mysql sur ta table quelle serait la réponse à
      select max(date_creation), min(date_creation), id_ligne, id_utilisateur from table
      group by id_utilisateur
      0
      1. Archeus01 Messages postés 1566 Date d'inscription   Statut Membre Dernière intervention   455 > jee pee Messages postés 31908 Date d'inscription   Statut Modérateur Dernière intervention  
         
        dans ma tête; c'était impossible de faire la requête demandée. J'allais avoir une erreur MySql, alors j'ai testé, c'est passé et je ne comprends pas. Mais alors plus du tout.

        Je ne comprends pas max et min finalement....
        Je viens de tester

        CREATE TABLE `user` (
        `id_ligne` int(11) NOT NULL,
        `id_utilisateur` int(11) NOT NULL,
        `date_creation` date NOT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


        INSERT INTO `user` (`id_ligne`, `id_utilisateur`, `date_creation`) VALUES
        (1, 1, '2016-11-01'),
        (2, 1, '2016-11-02'),
        (3, 1, '2016-11-03');

        select max(date_creation), id_ligne, id_utilisateur from user
        Je m'attendais à avoir un id_ligne = 3 , résultat :
        date_creation : '2016-11-03'
        Id utilisateur : 1
        id_ligne : 1 (WHAT?)

        J'ai lu plein de fois qu'on ne sait pas ce qu'on fait en MySql en mode permissif. Sans cas concret, je ne comprenais pas pourquoi. Vive l'argument massue.

        [EDIT]
        • va creuser sur le net pour comprendre*

        Tiens, je viens de voire un truc intéressant qui m'apprends que faire des sous-requêtes, ce n'est pas forcément mal : www.lafabriquedecode.com/blog/2013/06/mysql-max/

        [EDIT2] Je viens de comprendre ta requête... C'est super logique que le moteur la laisse passer.
        0