MySQL重复行 - 指定列

时间:2011-09-29 09:39:13

标签: mysql

如何运行查找行之间重复的查询?它不需要匹配一个字段而是多个字段。

这是表的EXPLAIN。

+-------------+--------------+------+-----+-------------------+----------------+
| Field       | Type         | Null | Key | Default           | Extra          |
+-------------+--------------+------+-----+-------------------+----------------+
| id          | int(11)      | NO   | PRI | NULL              | auto_increment | 
| token       | varchar(64)  | NO   | MUL | NULL              |                | 
| maxvar      | float        | NO   |     | NULL              |                | 
| maxvbr      | float        | NO   |     | NULL              |                | 
| minvcr      | float        | NO   |     | NULL              |                | 
| minvdr      | float        | NO   |     | NULL              |                | 
| atype       | int(11)      | NO   |     | NULL              |                | 
| avalue      | varchar(255) | NO   |     | NULL              |                | 
| createddate | timestamp    | NO   |     | CURRENT_TIMESTAMP |                | 
| timesrun    | int(11)      | NO   |     | NULL              |                | 
+-------------+--------------+------+-----+-------------------+----------------+

我需要匹配匹配的所有行:token,maxvar,maxvbr,minvcr,minvdr,type和avalue。如果所有这些字段都与另一行中的字段匹配,则将其视为“重复”。

最终我想将其作为删除命令运行,但我可以轻松改变选择。

UPDATE 仍在寻找使用MySQL中的单个查询删除的解决方案

4 个答案:

答案 0 :(得分:2)

只需将表连接到自身并比较行。您可以通过要求删除的ID大于副本的ID来确保使用最低ID保留副本:

DELETE FROM my_table WHERE id IN (
    SELECT DISTINCT t1.id 
    FROM my_table t1
        JOIN my_table t2 
    WHERE t1.id > t2.id
        AND t1.token = t2.token AND t1.maxvar = t2.maxvar
        AND t1.maxvbr = t2.maxvbr AND t1.minvcr = t2.minvcr
        AND t1.minvdr = t2.minvdr AND t1.type = t2.type)

答案 1 :(得分:1)

SELECT      token,maxvar,maxvbr,minvcr,minvdr,type, avalue,
            Count(*)
FROM        yourtable
GROUP BY    token,maxvar,maxvbr,minvcr,minvdr,type, avalue
HAVING      Count(*) > 1

此查询返回表中所有行的次数或次数(以及它们的频率)。

答案 2 :(得分:1)

尝试:

SELECT token,maxvar,maxvbr,minvcr,minvdr,type,avalue, COUNT(*)
FROM table
GROUP BY token,maxvar,maxvbr,minvcr,minvdr,type,avalue
HAVING COUNT(*)>1

答案 3 :(得分:1)

此查询将查找应删除的所有重复记录 -

SELECT t1.id FROM table_duplicates t1
  INNER JOIN (
    SELECT MIN(id) id, token, maxvar, maxvbr, minvcr, minvdr, atype, avalue FROM table_duplicates
    GROUP BY token, maxvar, maxvbr, minvcr, minvdr, atype, avalue
    HAVING COUNT(*) > 1
  ) t2
  ON t1.id <> t2.id AND t1.token = t2.token AND t1.maxvar=t2.maxvar AND t1.maxvbr = t2.maxvbr AND t1.minvcr = t2.minvcr AND t1.minvdr = t2.minvdr AND t1.atype = t2.atype AND t1.avalue = t2.avalue;

此查询将删除所有重复项 -

DELETE t1 FROM table_duplicates t1
  INNER JOIN (
    SELECT MIN(id) id, token, maxvar, maxvbr, minvcr, minvdr, atype, avalue FROM table_duplicates
    GROUP BY token, maxvar, maxvbr, minvcr, minvdr, atype, avalue
    HAVING COUNT(*) > 1
  ) t2
  ON t1.id <> t2.id AND t1.token = t2.token AND t1.maxvar=t2.maxvar AND t1.maxvbr = t2.maxvbr AND t1.minvcr = t2.minvcr AND t1.minvdr = t2.minvdr AND t1.atype = t2.atype AND t1.avalue = t2.avalue;