我在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_id
和orig_log_id
始终是唯一的。但是,对于任何其他字段,两行可能具有重复值。忽略*log_id
字段,我们的问题是所有其他列中的两行可能相同,但value
的值不同。我试图弄清楚正确的SQL查询,以确定两个(或更多)行何时具有date
,date_millis
和eib_address
的相同值,但value
的值不同,log_id
和orig_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.value
扔进ON
子句就不行了!
答案 0 :(得分:8)
我认为这比你想要的更简单。试试这个:
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;
分享并享受。
答案 1 :(得分: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