【问题标题】:How to get corresponding value from max(datetime) with MySQL?如何使用 MySQL 从 max(datetime) 中获取相应的值?
【发布时间】:2013-03-29 00:41:44
【问题描述】:

MySQL 软件表:

.------------------------------------------------------------.
| id | hostname   | software | version | install_date        |
|------------------------------------------------------------|
| 1  | computer-a | vim      | 1.00    | 2012-01-04 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-a | vim      | 2.00    | 2012-01-05 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-b | emacs    | 2.00    | 2012-01-04 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-b | emacs    | 1.00    | 2012-01-05 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-c | emacs    | 2.00    | 2012-01-05 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-c | vim      | 3.00    | 2012-01-05 00:00:00 | 
'------------------------------------------------------------'

MySQL 查询:

SELECT 
  hostname,
  MAX(IF(software = 'vim', version, NULL)) AS VIM,
  MAX(IF(software = 'emacs', version, NULL)) AS EMACS
FROM
  software
GROUP BY
  hostname;

结果:

+-------------+---------+----------+
| hostname    | VIM     | EMACS    |
+-------------+---------+----------+
| computer-a  | 2.0     | NULL     |
+-------------+---------+----------+
| computer-b  | NULL    | 2.0      |
+-------------+---------+----------+
| computer-c  | 3.0     | 2.0      |
+-------------+---------+----------+

http://www.sqlfiddle.com/#!8/6247d/3

问题是我想为每个software 显示具有最新install_date 的版本。 Computer-b 应该为 EMACS 显示 1.0。如何更改查询以完成此操作?

我可以将查询更改为:

SELECT 
  hostname,
  MAX(IF(software = 'vim', install_date, NULL)) AS VIM,
  MAX(IF(software = 'emacs', install_date, NULL)) AS EMACS
FROM
  software
GROUP BY
  hostname;

这会拉出正确的 install_date,但我怎样才能显示相应的 version

http://www.sqlfiddle.com/#!8/6247d/4

【问题讨论】:

    标签: mysql database pivot-table


    【解决方案1】:

    您可以使用子查询为每个 hostname 获取 max(install_date),然后将其连接回您的表:

    select s1.hostname,
      MAX(IF(software = 'vim', version, NULL)) AS VIM,
      MAX(IF(software = 'emacs', version, NULL)) AS EMACS
    from software s1
    inner join
    (
      select max(install_date) i_date,
        hostname
      from software
      group by hostname
    ) s2
      on s1.install_date = s2.i_date
      and s1.hostname = s2.hostname
    group by s1.hostname
    

    SQL Fiddle with Demo。结果是:

    |   HOSTNAME |    VIM |  EMACS |
    --------------------------------
    | computer-a |   2.00 | (null) |
    | computer-b | (null) |   1.00 |
    | computer-c |   3.00 |   2.00 |
    

    如果software 可能有不同的install_date,您可能需要group by 子查询中的hostnamesoftware

    select s1.hostname,
      MAX(IF(s1.software = 'vim', version, NULL)) AS VIM,
      MAX(IF(s1.software = 'emacs', version, NULL)) AS EMACS
    from software s1
    inner join
    (
      select max(install_date) i_date,
        hostname, software
      from software
      group by hostname, software
    ) s2
      on s1.install_date = s2.i_date
      and s1.hostname = s2.hostname
    group by s1.hostname
    

    SQL Fiddle with Demo

    【讨论】:

    • 一个问题,如果在其中一台计算机-c 安装上更改日期,您将只能看到最新安装的版本。 sqlfiddle.com/#!8/4db01/1
    • @codybuell 然后您将更改子查询以按主机名和软件进行分组 -- sqlfiddle.com/#!8/4db01/6 和我的编辑
    猜你喜欢
    • 2017-06-10
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多