MySQL:在时间戳上使用 max 函数的意外结果
MySQL: Undesired result with max function on a timestamp
我使用 Mantis 漏洞数据库(使用 MySQL),我想查询哪些漏洞在过去 2 周内的严重性发生了变化,但是只有漏洞的最后一次严重性变化应该是表明的。
问题是,我为每个 bugID(这是主键)获得了多个条目,这不是我想要的结果,因为我只想对每个错误进行最新更改。这意味着我以某种方式错误地使用了 max 函数和 group by 子句。
在这里你可以看到我的查询:
SELECT `bug_id`,
max(date_format(from_unixtime(`mantis_bug_history_table`.`date_modified`),'%Y-%m-%d %h:%i:%s')) AS `Severity_changed`,
`mantis_bug_history_table`.`old_value`,
`mantis_bug_history_table`.`new_value`
from `prepared_bug_list`
join `mantis_bug_history_table` on `prepared_bug_list`.`bug_id` = `mantis_bug_history_table`.`bug_id`
where (`mantis_bug_history_table`.`field_name` like 'severity')
group by `bug_id`,`old_value`,`.`new_value`
having (`Severity_modified` >= (now() - interval 2 week))
order by bug_id` ASC
例如,对于 ID 为 8 的错误,我通过此查询获得了三个条目。 ID 为 8 的错误在过去 2 周内确实发生了三个严重性变化,但我只想获得最新的严重性变化。
我的查询可能有什么问题?
max()
是一个聚合函数,它似乎不适合您要执行的操作。
我感觉你正在尝试做的是从 mantis_bug_history_table
中所有适用的 bug_id 中获取最新的。如果这是真的,那么我将按以下方式重写查询——我会写一个 sub-query getLatest
并将其与 prepared_bug_list
连接起来
更新答案
注意:我无权访问实际的数据库表,因此此查询可能存在错误
select
`getLatest`.`last_bug_id`
, `mantis_bug_history_table`.`date_modified`
, `mantis_bug_history_table`.`old_value`
, `mantis_bug_history_table`.`new_value`
from
(
select
(
select
`bug_id`
from
`mantis_bug_history_table`
where
`date_modified` > unix_timestamp() - 14*24*3600 -- two weeks
and `field_name` like 'severity'
and `bug_id` = `prepared_bug_list`.`bug_id`
order by
`date_modified` desc
limit 1
) as `last_bug_id`
from
`prepared_bug_list`
) as `getLatest`
inner join `mantis_bug_history_table`
on `prepared_bug_list`.`bug_id` = `getLatest`.`last_bug_id`
order by `getLatest`.`bug_id` ASC
我终于有办法了!我的朋友帮助了我,解决方案的一部分是包括螳螂错误历史记录的主键 table,它不是 bug_id,而是列 ID,它是一个连续的数字。
解决方案的另一部分是 where 子句中的子查询:
select `prepared_bug_list`.`bug_id` AS `bug_id`,
`mantis_bug_history_table`.`old_value` AS `old_value`,
`mantis_bug_history_table`.`new_value` AS `new_value`,
`mantis_bug_history_table`.`type` AS `type`,
date_format(from_unixtime(`mantis_bug_history_table`.`date_modified`),'%Y-%m-%d %H:%i:%s') AS `date_modified`
FROM `prepared_bug_list`
JOIN mantis_import.mantis_bug_history_table
ON `prepared_bug_list`.`bug_id` = mantis_bug_history_table.bug_id
where (mantis_bug_history_table.id = -- id = that is the id of every history entry, not confuse with bug_id
(select `mantis_bug_history_table`.`id` from `mantis_bug_history_table`
where ((`mantis_bug_history_table`.`field_name` = 'severity')
and (`mantis_bug_history_table`.`bug_id` = `prepared_bug_list`.`bug_id`))
order by `mantis_bug_history_table`.`date_modified` desc limit 1)
and `date_modified` > unix_timestamp() - 14*24*3600 )
order by `prepared_bug_list`.`bug_id`,`mantis_bug_history_table`.`date_modified` desc
我使用 Mantis 漏洞数据库(使用 MySQL),我想查询哪些漏洞在过去 2 周内的严重性发生了变化,但是只有漏洞的最后一次严重性变化应该是表明的。
问题是,我为每个 bugID(这是主键)获得了多个条目,这不是我想要的结果,因为我只想对每个错误进行最新更改。这意味着我以某种方式错误地使用了 max 函数和 group by 子句。
在这里你可以看到我的查询:
SELECT `bug_id`,
max(date_format(from_unixtime(`mantis_bug_history_table`.`date_modified`),'%Y-%m-%d %h:%i:%s')) AS `Severity_changed`,
`mantis_bug_history_table`.`old_value`,
`mantis_bug_history_table`.`new_value`
from `prepared_bug_list`
join `mantis_bug_history_table` on `prepared_bug_list`.`bug_id` = `mantis_bug_history_table`.`bug_id`
where (`mantis_bug_history_table`.`field_name` like 'severity')
group by `bug_id`,`old_value`,`.`new_value`
having (`Severity_modified` >= (now() - interval 2 week))
order by bug_id` ASC
例如,对于 ID 为 8 的错误,我通过此查询获得了三个条目。 ID 为 8 的错误在过去 2 周内确实发生了三个严重性变化,但我只想获得最新的严重性变化。
我的查询可能有什么问题?
max()
是一个聚合函数,它似乎不适合您要执行的操作。
我感觉你正在尝试做的是从 mantis_bug_history_table
中所有适用的 bug_id 中获取最新的。如果这是真的,那么我将按以下方式重写查询——我会写一个 sub-query getLatest
并将其与 prepared_bug_list
更新答案
注意:我无权访问实际的数据库表,因此此查询可能存在错误
select
`getLatest`.`last_bug_id`
, `mantis_bug_history_table`.`date_modified`
, `mantis_bug_history_table`.`old_value`
, `mantis_bug_history_table`.`new_value`
from
(
select
(
select
`bug_id`
from
`mantis_bug_history_table`
where
`date_modified` > unix_timestamp() - 14*24*3600 -- two weeks
and `field_name` like 'severity'
and `bug_id` = `prepared_bug_list`.`bug_id`
order by
`date_modified` desc
limit 1
) as `last_bug_id`
from
`prepared_bug_list`
) as `getLatest`
inner join `mantis_bug_history_table`
on `prepared_bug_list`.`bug_id` = `getLatest`.`last_bug_id`
order by `getLatest`.`bug_id` ASC
我终于有办法了!我的朋友帮助了我,解决方案的一部分是包括螳螂错误历史记录的主键 table,它不是 bug_id,而是列 ID,它是一个连续的数字。 解决方案的另一部分是 where 子句中的子查询:
select `prepared_bug_list`.`bug_id` AS `bug_id`,
`mantis_bug_history_table`.`old_value` AS `old_value`,
`mantis_bug_history_table`.`new_value` AS `new_value`,
`mantis_bug_history_table`.`type` AS `type`,
date_format(from_unixtime(`mantis_bug_history_table`.`date_modified`),'%Y-%m-%d %H:%i:%s') AS `date_modified`
FROM `prepared_bug_list`
JOIN mantis_import.mantis_bug_history_table
ON `prepared_bug_list`.`bug_id` = mantis_bug_history_table.bug_id
where (mantis_bug_history_table.id = -- id = that is the id of every history entry, not confuse with bug_id
(select `mantis_bug_history_table`.`id` from `mantis_bug_history_table`
where ((`mantis_bug_history_table`.`field_name` = 'severity')
and (`mantis_bug_history_table`.`bug_id` = `prepared_bug_list`.`bug_id`))
order by `mantis_bug_history_table`.`date_modified` desc limit 1)
and `date_modified` > unix_timestamp() - 14*24*3600 )
order by `prepared_bug_list`.`bug_id`,`mantis_bug_history_table`.`date_modified` desc