gpt4 book ai didi

mysql - 如果条件匹配则返回 2 个表中的数据

转载 作者:行者123 更新时间:2023-11-29 13:10:21 25 4
gpt4 key购买 nike

我不太确定该怎么做。我有一个网站可以跟踪服务器何时出现故障。因此,我有 1 个表,其中包含服务器名称和 ID,名为 servers,另一个表保存错误消息,名为 errors。我想返回过去 7 天的类似于日历的 View ,该 View 将显示我们的任何服务器中是否发生错误。

到目前为止,我有一个查询可以查找任何一台服务器当天的错误消息,但我不知道如何返回良好且有 0 个错误的服务器。

SELECT errors.error_id, servers.server_id, errors.start_time, servers.name
FROM errors
INNER JOIN servers ON errors.server_id=servers.server_id
WHERE errors.start_time BETWEEN '2014-02-25 00:00:00' AND '2014-02-25 23:59:59'

我让它循环了 7 天,一切正常。但我一直不知道如何获取当天没有宕机的服务器的 ID 和名称。我一直在考虑在查询中实现 IF 或 CASE,但我以前从未使用过它们,而且我不太确定它是如何工作的。

我是否需要为此运行多个查询,或者是否可以运行一个查询?

最佳答案

与其重复这些日子,不如一次完成所有事情。假设您每天至少有一个错误,您可以从 errors 表中获取此信息。否则,您可能需要一个日历表:

SELECT dates.thedate, e.error_id, s.server_id, e.start_time, s.name
FROM (select distinct date(start_time) as thedate
from errors
where e.start_time BETWEEN '2014-02-25 00:00:00' AND '2014-03-03 23:59:59'
) dates cross join
servers s LEFT OUTER JOIN
errors e
ON e.server_id = s.server_id;

这将为每天每台服务器的每个错误生成一行。如果没有错误,每个服务器都会有一行错误字段中带有 NULL。如果你想聚合这个:

SELECT dates.thedate, s.server_id, s.name, count(*) as numErrors,
group_concat(error_id order by e.start_time) as errorIds,
group_concat(se.tart_time order by e.start_time) as startTimes
FROM (select distinct date(start_time) as thedate
from errors
where e.start_time BETWEEN '2014-02-25 00:00:00' AND '2014-03-03 23:59:59'
) dates cross join
servers s LEFT OUTER JOIN
errors e
ON e.server_id = s.server_id and date(e.start_time) = dates.thedate
GROUP BY dates.thedate, s.server_id, s.name;

编辑:

如果没有日历表,您可以将每一天插入到查询中,如下所示:

SELECT dates.thedate, s.server_id, s.name, count(*) as numErrors,
group_concat(error_id order by e.start_time) as errorIds,
group_concat(se.tart_time order by e.start_time) as startTimes
FROM (select date('2014-02-25') as thedate union all
select date('2014-02-26') union all
select date('2014-02-27') union all
select date('2014-02-28') union all
select date('2014-03-01') union all
select date('2014-03-02') union all
select date('2014-03-03')
) dates cross join
servers s LEFT OUTER JOIN
errors e
ON e.server_id = s.server_id and date(e.start_time) = dates.thedate
GROUP BY dates.thedate, s.server_id, s.name;

关于mysql - 如果条件匹配则返回 2 个表中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com