如何使用MySQL从max(datetime)中获取相应的值?

如何使用MySQL从max(datetime)中获取相应的值?,mysql,database,pivot-table,Mysql,Database,Pivot Table,MySQL软件表: .------------------------------------------------------------. | id | hostname | software | version | install_date | |------------------------------------------------------------| | 1 | computer-a | vim | 1.00 | 2012-01-04

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      |
+-------------+---------+----------+

问题是我想为每个
软件
显示最新的
安装日期
版本。对于EMACS,Computer-b应显示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;
这将获取正确的安装日期,但如何显示相应的
版本


您可以使用子查询获取每个
主机名的
最大值(安装日期)
,然后将其连接回您的表:

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
看。结果是:

|   HOSTNAME |    VIM |  EMACS |
--------------------------------
| computer-a |   2.00 | (null) |
| computer-b | (null) |   1.00 |
| computer-c |   3.00 |   2.00 |
如果
软件
可能具有不同的
安装日期
,则可能需要在子查询中对
主机名
软件
进行
分组:

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

请参见

一个问题,如果更改了其中一个computer-c安装的日期,则只能看到最新安装的版本@codybuell然后您将通过主机名和软件以及我的编辑将子查询更改为group