好的,所以准备好我正在做一个奇怪的基础: 每个表只有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
无用。我该如何解决这个问题?
我希望为给定操作系统类型的每个服务器提供最后一个补丁日期,然后按日期对结果求和。
答案 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);