按日期列出MySQL表中的差异

时间:2012-06-01 14:48:23

标签: php mysql

Day1
IP Address  Model Number    MAC Address Host Name   Date    Phone Load Version
10.1.1.14   CP-8945 70CA9B010000    SEP70CA9B01001  2012-06-01 SCCP 9-2-2-0
10.1.1.15   CP-8945 70CA9B010001    SEP70CA9B01002  2012-06-01 SCCP 9-2-2-0
10.1.1.16   CP-8945 70CA9B010002    SEP70CA9B01003  2012-06-01 SCCP 9-2-2-0
10.1.1.17   CP-8945 70CA9B010003    SEP70CA9B01004  2012-06-01 SCCP 9-2-2-0

Day2
IP Address  Model Number    MAC Address Host Name   Date    Phone Load Version
10.1.1.14   CP-8945 70CA9B010000    SEP70CA9B01001  2012-06-02 SCCP 9-2-2-0
10.1.1.15   CP-8945 70CA9B010001    SEP70CA9B01002  2012-06-02 SCCP 9-2-2-0
10.1.1.16   CP-8945 70CA9B010002    SEP70CA9B01003  2012-06-02 SCCP 9-2-2-0
10.1.1.17   CP-8945 70CA9B010003    SEP70CA9B01004  2012-06-02 SCCP 9-2-2-1

Result
10.1.1.17   CP-8945 70CA9B010003    SEP70CA9B01004  2012-06-02 SCCP 9-2-2-1

我不确定这是否可行。我有一个MySQL表,除了date之外还有多个匹配的行。我如何比较2个日期并列出任何列中的差异?

2 个答案:

答案 0 :(得分:0)

听起来像你想要的是设置差异。

在代码中处理此问题的一种简单方法是简单地计算相关数据的设置差异。您可以通过简单地连接指示更改的字段(并且可能将它们与颜色连接以便稍后将它们分开)来为每行创建“指纹”。

伪代码:

SET1 = SELECT CONCAT(ip, ":", model_number, ":", mac_address, ":", host_name, ":", load_version) FROM day1

SET2 = SELECT CONCAT(ip, ":", model_number, ":", mac_address, ":", host_name, ":", load_version) FROM day1

RESULT = SET2 - SET1

答案 1 :(得分:0)

我之前在SQL Trigger中尝试过相同的场景,这就是我所做的。

SELECT 
    d2.ip_add,
    d2.mdl_num,
    d2.mac_add,
    d2.host_name,
    d2.date,
    d2.phone,
    d2.load_ver
From 
    day2 d2
LEFT JOIN
    day1 d1
ON
d1.ip_add = d2.ip_add
WHERE
    d2.ip_add <> d1.ip_add
OR 
    d2.mdl_num <> d1.mdl_num
OR
    d2.mac_add <> d1.mac_add
OR
    d2.host_name <> d1.host_name
OR
    d2.phone <> d1.phone
OR
    d2.load_ver <> d1.load_ver; 

这将返回两个相同表之间的差异。

我编辑我的查询,以便它只能查看1个表。 试试这个,

SELECT 
    d2.ip_add,
    d2.mdl_num,
    d2.mac_add,
    d2.host_name,
    d2.date,
    d2.phone,
    d2.load_ver
FROM 
        (SELECT 
            ip_add,
            mdl_num,
            mac_add,
            host_name,
            DATE,
            phone,
            load_ver,
            day
         FROM
            tblRecords
         WHERE
            day = 2
         ) AS d2
LEFT JOIN
        (SELECT 
            ip_add,
            mdl_num,
            mac_add,
            host_name,
            DATE,
            phone,
            load_ver,
            day
         FROM
            tblRecords
         WHERE
             day = 1
        ) AS d1
ON
    d1.ip_add = d2.ip_add
WHERE
    d2.ip_add <> d1.ip_add
OR 
    d2.mdl_num <> d1.mdl_num
OR
    d2.mac_add <> d1.mac_add
OR
    d2.host_name <> d1.host_name
OR
    d2.phone <> d1.phone
OR
    d2.load_ver <> d1.load_ver;