2011-03-23 44 views
2

不同我有一個在MySQL 5.1以下的表格:發現「重複」行,在一列

+--------------+----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+----------------+------+-----+---------+----------------+ 
| log_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| date   | datetime  | NO | MUL | NULL |    | 
| date_millis | int(3)   | NO |  | NULL |    | 
| eib_address | varchar(20) | NO |  | NULL |    | 
| ip_address | varchar(15) | NO |  | NULL |    | 
| value  | decimal(20,10) | NO | MUL | NULL |    | 
| application | tinyint(4)  | NO |  | NULL |    | 
| phys_address | varchar(20) | NO |  | NULL |    | 
| orig_log_id | bigint(20)  | NO |  | NULL |    | 
+--------------+----------------+------+-----+---------+----------------+ 

在此表中,log_idorig_log_id始終是唯一的。不過,有可能兩行可能具有任何其他字段的重複值。忽略*log_id字段,我們的問題是所有其他列中的兩行可能相同,但value的值不同。我試圖找出正確的SQL查詢來確定何時兩個(或更多)行的date,date_milliseib_address具有相同的值,但value,log_idorig_log_id的值不同。到目前爲止,我已經能夠拿出的是完成第一條我在前面句子查詢:

SELECT main.* 
FROM sensors_log main 
INNER JOIN 
    (SELECT date, date_millis, eib_address 
    FROM sensors_log 
    GROUP BY date, date_millis, eib_address 
    HAVING count(eib_address) > 1) dupes 
ON main.date = dupes.date 
    AND main.date_millis = dupes.date_millis 
    AND main.eib_address = dupes.eib_address; 

不過,我似乎無法弄清楚的時候value不同。我至少知道,只是投入AND main.value != dupes.valueON條款不行!

回答

7

我認爲這比你想要做的更簡單一些。試試這個:

SELECT * 
    FROM SENSORS_LOG s1 
    INNER JOIN SENSORS_LOG s2 
    ON (s2.DATE = s1.DATE AND 
     s2.DATE_MILLIS = s1.DATE_MILLIS AND 
     s2.EIB_ADDRESS = s1.EIB_ADDRESS) 
    WHERE s1.VALUE <> s2.VALUE OR 
     s1.LOG_ID <> s2.LOG_ID OR 
     s1.ORIG_LOG_ID <> s2.ORIG_LOG_ID; 

分享和享受。

+0

這或多或少是我需要什麼。我寧願沒有這兩個表的全部內容,但它會做到這一點。謝謝。 – GarlicFries 2011-03-23 16:47:13

+0

這讓它變得如此簡單!正是我在找什麼,以及。我明顯地只選擇了我關心的專欄,但在這個解決方案中普遍性非常好。 – missscripty 2016-07-07 17:05:28

1

也許我誤解了這個問題,但是你不能僅僅執行這樣的COUNT嗎?

SELECT date, date_millis, eib_address, count(*) as nr_dupes 
FROM sensors_log 
GROUP BY date, date_millis, eib_address 
HAVING count(*) > 1 

SELECT date, date_millis, eib_address, 
     group_concat(value), group_concat(log_id), group_concat(orig_log_id) 
FROM sensors_log 
GROUP BY date, date_millis, eib_address 
HAVING count(*) > 1 
+0

第一個建議對我來說是第一次嘗試。 +1 – Watusimoto 2013-03-28 14:57:39