web-dev-qa-db-fra.com

MySQL select MAX (date/heure) ne renvoyant pas de valeur max

Exemple de tableau:

id   computer  app      version     build    date
---|---------|------|------------|-------|---------
1  |  aaaa1  | app1 |   1.0.0    |   1   | 2013-11-11 09:51:07
2  |  aaaa1  | app2 |   2.0.0    |   2   | 2013-11-12 09:51:07
5  |  xxxx2  | app1 |   1.0.0    |   1   | 2013-11-13 09:51:07
3  |  cccc3  | app2 |   3.1.0    |   1   | 2013-11-14 09:51:07
4  |  xxxx2  | app1 |   1.0.0    |   2   | 2013-11-15 09:51:07
5  |  cccc3  | app2 |   3.1.1    |   3   | 2013-11-16 09:51:07
6  |  xxxx2  | app1 |   1.0.2    |   1   | 2013-11-17 09:51:07
7  |  aaaa1  | app1 |   1.0.2    |   3   | 2013-11-18 09:51:07

Sortie souhaitée (format et ordre de classement non exacts), obtenant la dernière installation pour chaque application sur chaque ordinateur:

7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07
2. aaaa1 - app2 - 2.0.0 - 2 - 2013-11-12 09:51:07
6. xxxx2 - app1 - 1.0.2 - 1 - 2013-11-17 09:51:07
5. cccc3 - app2 - 3.1.1 - 3 - 2013-11-16 09:51:07

Ma déclaration SQL:

SELECT 
        id,
        computer, 
        app, 
        version, 
        build, 
        MAX(date) AS installed
    FROM 
        data 
    WHERE 
        placement = 'xxx'
    GROUP BY 
        app, computer
    ;

Cela me donne:

1. aaaa1 - app1 - 1.0.0 - 1 - 2013-11-11 09:51:07

et pas 

7. aaaa1 - app1 - 1.0.2 - 3 - 2013-11-18 09:51:07

comme je l'attendais.

MAX (date) fonctionne si jeSEULEMENTsélectionne MAX (date) et rien d’autre. Mais alors je ne reçois aucune donnée avec laquelle travailler (juste la date la plus récente).

SELECT 
        MAX(date) AS installed

Je ne suis pas un ninja SQL alors je vais vite me sentir chauve en me gratifiant la tête à cause de cela. 

10
DannyThunder

Essayez comme ça:

SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
  SELECT computer, app, max(DATE) AS installed
  FROM data
  GROUP BY computer, app
  ) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'

La requête interne vous donne le maximum (date) pour chaque paire d’ordinateurs et d’applications, puis rejoignez-la simplement pour obtenir le reste des informations.

9
Filipe Silva

Essayez en convertissant le champ Date/heure 

 SELECT 
            id,
            computer, 
            app, 
            version, 
            build, 
            MAX(cast(date as Datetime)) AS installed
        FROM 
            data 
        WHERE 
            placement = 'xxx'
        GROUP BY 
           app, computer, id, version, build
        ;
5
par181

Quel est le problème avec:

SELECT 
    id,
    computer, 
    app, 
    version, 
    build, 
    `date` AS installed
FROM 
    data 
WHERE 
    placement = 'xxx'
ORDER BY installed DESC
GROUP BY app;
0
Gravy

C'est peut-être parce que vous stockez votre date sous forme de chaîne et que la comparaison d'une chaîne agit différemment de la comparaison d'un entier. Vous devriez stocker votre date au format unix Timestamp , et ils seront beaucoup plus faciles à comparer. Mais il faudra un effort supplémentaire pour être affiché comme date anglaise normale.

0
artusat0r

MAX ne fonctionnait pas pour moi, ce qui a fonctionné était une sous-requête supplémentaire pour laquelle j'ai pré-commandé un tableau par date:

SELECT d.id, d.computer, d.app, d.version, d.build, a.installed
FROM data d
INNER JOIN (
  SELECT computer, app, date as installed
  FROM (
    SELECT computer, app, date
    FROM data
    ORDER BY date desc
  ) as t
  GROUP BY computer, app
  ) a ON a.computer = d.computer AND a.app = d.app
WHERE placement = 'xxx'
0
Andrius K

max - est une fonction d'agrégat essaye d'ajouter toutes les colonnes de l'instruction select à GROUP BY:

GROUP BY 
    app, computer, id, version, build.
0
edem