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

标签 mysql database pivot-table

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

问题是我想显示每个软件的最新install_date版本。计算机 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 但我如何显示相应的版本

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

最佳答案

您可以使用子查询获取每个主机名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 |

如果软件可以有,您可能需要在子查询中对主机名软件进行分组不同的安装日期:

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

关于mysql - 如何使用MySQL从max(datetime)中获取相应的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694618/

相关文章:

excel - 如何更改 Excel 连接以阻止只读错误

mysql - 如何指示MySQL不将表缓存在内存中?

mysql - 如何将 MySQL 触发器异常/失败信息存储到表或变量中

sql - 我可以在一个查询中选择两个表吗?

python - 如何在Python中对两列进行透视和排序?

python - 在使用 pd.pivot_table 制作的散点图中为每个类设置不同的颜色

php - PHP 中的 MySQL 查询不会打印结果

MYSQL:显示来自两个不相关表的 select 语句的一个查询

mysql - Insert Record into Table MySQL 查询语法错误

c# - 从 bcp 客户端接收到 colid 6 的无效列长度