2017-08-28 101 views
-2

表1包含所有数据记录:从表插入到表2 1

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 
. 
. 

我需要表现出不同形式的这个数据,所以我可以在web界面 打印出来我如何可以插入表2表1数据,因此它看起来就像 这样:

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 
.  

谢谢。

+1

你在这里显示了功夫,但更重要的是,你的问题是普遍存在与不可预见的边缘情况。解释输出中分组的逻辑。 –

+0

你到目前为止尝试过什么?请发布您的查询 – etsa

+4

这似乎是对https://stackoverflow.com/q/45914837/1415724的转发,它应该可能会以完全重复的方式关闭,因为它会收到答案。 –

回答

1

好吧,所以你是新来的查询,并不像许多查询那么简单。 Here is a SQLFiddle of your sample

首先,因为您没有指示哪个问题出现在哪个问题上,所以这是隐含的,它们在第一次点击时解析,首先解析相应的主机。

现在,表列名称。如果可以的话,尽量避免使用表格名称和保留字的列名,否则可能妨碍它们。 (触发器,例如日期)。

现在,看看你需要解决的问题。对于每个问题(最外面的WHERE子句),您需要找到与该问题/主机对应的第一个“确定”。所以在这里,我使用同一张表3次,但使用不同的“别名”名称引用,所以我知道哪一个是哪个(通过tProb,tOk,tChk)。

问题和Ok之间的左连接是因为并非所有问题都可以解决。如果没有找到相应的Ok记录,这将允许问题显示为OPEN。连接条件本身相当简单...加入相同的主机名。

但是,ID的连接的第二部分是棘手的。在这里,它是一个相关的子查询(通常是性能杀手)。对于每个问题,您需要找到该主机的第一个(通过MIN)ID,并且该状态为OK状态,且该ID大于问题的ID。您不希望将ID = 2的OK与ID = 3的PROBLEM关联。通过使用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 

为了帮助简化此查询,最好在问题ID的表格中添加另一列。输入解决方案条目时,应在其中插入问题ID作为基础。不一定是对原始问题进行反标的要求,只是解决方案以确定它是从队列中解决的问题。

+0

非常感谢@DRapp这正是我想要的,我会测试它 – wael

+0

它的作品非常魅力非常感谢你@DRapp !!!! – wael

+0

@wael,很高兴帮助。此外,请点击答案旁边的复选框,以便其他人知道已经解决并帮助其他人进行类似的搜索。过去有一个链接网站礼仪发布问题,标记为答案,上/下投票也。将来,如果您需要,请在某人提出要求时修改/修改您的原始帖子。然后让那个人知道你修改了而不是插入像这样的评论。 – DRapp

0

从现有表复制部分数据到新的一个,你用在SELECT声明WHERE条款如下:

CREATE TABLE new_table 
SELECT col, col2, col3 
FROM 
    existing_table;