计算不同日期MySQL返回一行

时间:2017-11-22 17:51:29

标签: mysql sql

好的,所以准备好我正在做一个奇怪的基础: 每个表只有3列:varchar('Object'),varchar('Property'),varchar('Value')

这是我用我的尝试的例子构建的小提琴 http://sqlfiddle.com/#!9/de22eb/1

我需要提取服务器上次更新的时间。但我对服务器本身并不感兴趣,更多的是关于日期。一旦我知道有一个日期的更新,我想要计算当天的每个更新。

为此,我使用了2个表:服务器表

CREATE TABLE IF NOT EXISTS `server` (
  `name` varchar(80) NOT NULL,
  `field` varchar(80) NOT NULL,
  `value` varchar(200) NOT NULL
);

事件表:

CREATE TABLE IF NOT EXISTS `event` (
  `name` varchar(80) NOT NULL,
  `field` varchar(80) NOT NULL,
  `value` varchar(80) NOT NULL
);

请注意小提琴,了解内容。

我希望得到这样的结果(基于我的例子):

Date         Number patched
2017-11-14   2
2017-11-04   1

问题在于我不知道我的查询在哪里出错(我已经将步骤分开以便更好地理解小提琴内部):

Select date_format(d.val, '%Y-%m-%d') as 'Date', COUNT(distinct 
date_format(d.val, '%Y-%m-%d')) as 'Number' 
FROM (
    Select b.serv,b.val 
    FROM (
        Select serv,val FROM (
          Select name as serv, value as val FROM event 
          where field='server_vers' and 
          value!='None' 
          order by serv ASC, 
          val DESC LIMIT 18446744073709551615) a 
        group by a.serv) b, 
        server c 
    where b.serv = c.name and c.field = 'OS' and c.value = 'Fedora'
) d group by date_format(d.val, '%Y-%m-%d');

它只给我一排。最后添加group by date_format(d.val, '%Y-%m-%d')会使Count无用。我该如何解决这个问题?

我希望为给定操作系统类型的每个服务器提供最后一个补丁日期,然后按日期对结果求和。

2 个答案:

答案 0 :(得分:2)

这就是你需要的吗?

SELECT dates.date, COUNT(dates.date) as patch_count
FROM (
  SELECT MAX(date_format(event.value, '%Y-%m-%d')) as date
  FROM event
  JOIN server ON (event.name = server.name)
  WHERE (server.field = 'OS' AND server.value = 'Fedora')
  GROUP BY event.name ) as dates
GROUP BY 1
ORDER BY 2 DESC

这是小提琴:

http://sqlfiddle.com/#!9/de22eb/37/0

说明:我们获取每个服务器名称的最后日期。这给出了最后日期的列表。然后我们将其用作表格,我们可以将其分组以计算每个不同的值。

答案 1 :(得分:1)

日期时间存储为字符串。该字符串的前十个字符代表日期。因此,您可以使用left(value, 10)获取日期。

通过按服务器分组并检索max(left(value, 10)),您可获得每台服务器的上次更新,因为字母顺序适用于'yyyy-mm-dd'

select name, max(left(value, 10))
from event 
where field = 'server_vers' 
and value <> 'None' 
group by name

在此基础上进行构建以获取这些最后更新日期的更新次数:

select left(value, 10), count(*)
from event
where field = 'server_vers'
and left(value, 10) in
(
  select max(left(value, 10))
  from event 
  where field = 'server_vers' 
  and value <> 'None' 
  group by name
)
group by left(value, 10)
order by left(value, 10);