从表1插入表2

时间:2017-08-28 10:18:23

标签: php mysql

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

谢谢。

2 个答案:

答案 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;