繁体   English   中英

MySQL选择MAX(datetime)不返回最大值

[英]MySQL select MAX(datetime) not returning max value

示例表:

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

所需的输出(不是确切的格式或列表顺序),在每台计算机上获取每个应用程序的最新安装:

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

我的SQL语句:

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

这给了我:

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

并不是

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

正如我所料。

如果我选择MAX(日期)而没有别的,则MAX(日期)有效。 但后来我没有得到任何数据(只是最新日期)。

SELECT 
        MAX(date) AS installed

我不是一个SQL忍者,所以我很快就会因为这个而挠头。

试试这样:

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'

内部查询为您提供每对计算机和应用程序的最大值(日期),然后您只需加入它以获取其余信息。

尝试通过强制转换Datetime字段

 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
        ;

max - 是一个聚合函数,尝试将select语句中的所有列添加到GROUP BY

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

这可能是因为您将日期存储为String,并且比较字符串的行为与比较整数不同。 您应该以unix时间戳格式存储日期,它们将更容易比较。 但需要额外的努力才能显示为正常的英语日期。

什么错了:

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

MAX对我不起作用,有效的是附加子查询,我按日期预先排序:

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM