我有 table1 ,其中包含所有数据日志:
id hostname trigger date
1 10.10.10.1 PROBLEM 2017-08-04 14:10
2 10.10.10.1 OK 2017-08-04 14:56
3 10.10.10.1 PROBLEM 2017-08-04 15:42
4 10.10.10.1 OK 2017-08-04 15:43
5 10.10.10.2 PROBLEM 2017-08-09 01:19
6 10.10.10.2 OK 2017-08-09 01:58
.
.
我需要以不同的形式显示这些数据,以便我可以在网络界面中打印它 如何从表1 中插入表2 数据,以便它看起来像 这个:
id hostname triprob datpro triok dateok
1 10.10.10.1 PROBLEM 2017-08-04 14:10 OK 2017-08-04 14:56
2 10.10.10.1 PROBLEM 2017-08-04 15:42 OK 2017-08-04 15:43
3 10.10.10.2 PROBLEM 2017-08-09 01:19 OK 2017-08-09 01:58
.
谢谢。
答案 0 :(得分:1)
好的,所以你不熟悉查询,也不像许多查询那么简单。 Here is a SQLFiddle of your sample
首先,因为你没有关于哪个OK与哪个问题有关的指示,所以暗示他们在第一次点击时被解析,首先为相应的主机解析。
现在,表列名称。如果可以,尝试使用表名和列名来避免使用其他保留字,它们可能会妨碍使用。 (触发器,日期等)。
现在,看看你需要解决的问题。对于每个问题(最外面的WHERE子句),您需要找到与该问题/主机相对应的FIRST“OK”。所以在这里,我使用相同的表3次,但使用不同的“别名”名称引用,所以我知道哪一个(通过tProb,tOk,tChk)。
问题和确定之间的左连接是因为并非所有问题都可以解决。如果没有找到相应的Ok记录,这将允许问题显示为OPEN。连接条件本身很简单......加入相同的主机名。
然而,ID的连接的第二部分是棘手的。在这里,它是一个CORRELATED SUB-QUERY(通常是性能杀手)。对于每个问题,您需要找到该主机的FIRST(通过MIN)ID,并且状态良好且ID大于问题ID。您不希望将ID = 2的OK与ID = 3的问题关联。通过使用MIN(),您将只保证一个条目(如果有)。
最后,COALESCE()的字段选择是识别从ok表中获取值,如果找到的话。如果未找到,请为显示屏保留一个空白值..或' - 仍然打开 - '为“状态”。
SELECT
tProb.id as ProblemID,
tProb.hostName,
tProb.trigger as Problem,
tProb.date as ProblemDate,
coalesce( tOk.id, 0 ) as OkID,
coalesce( tOk.`trigger`, '- still open -' ) as OkStatus,
coalesce( tOk.`Date`, ' ' ) as OkDate
from
Table1 tProb
LEFT JOIN Table1 tOk
ON tProb.hostName = tOk.hostName
AND tOk.ID in
( select
MIN( tChk.ID ) as ID
from
Table1 tChk
where
tChk.HostName = tProb.HostName
AND tChk.ID > tProb.ID
AND tChk.trigger = 'OK' )
where
tProb.trigger = 'PROBLEM'
order by
tProb.id
为了帮助简化此查询,您最好在表中为problemID添加另一列。输入解决方案条目时,应在此处插入问题的ID作为基础。不一定要求支持原始问题,只需要确定从队列中解析哪个问题的解决方案。
答案 1 :(得分:0)
要将现有表中的部分数据复制到新表,请在WHERE
语句中使用SELECT
子句,如下所示:
CREATE TABLE new_table
SELECT col, col2, col3
FROM
existing_table;