在没有原始的mysql中找到重复的记录

时间:2019-03-17 14:29:23

标签: mysql

我想提取MySQL数据库中的重复记录。这可以通过以下方式完成:

SELECT firstname, 
   lastname, 
   list.address 
FROM list
   INNER JOIN (SELECT address
               FROM   list
               GROUP  BY address
               HAVING COUNT(id) > 1) dup
           ON list.address = dup.address;

这将导致:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST

我希望将其拉出,以使其显示重复的每一行。像这样:

JIM    JONES    100 MAIN ST

如果结果是:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST
JOHN   SMITH    100 MAIN ST

我希望将其拉出,以使其显示重复的每一行。像这样:

JOHN   SMITH    100 MAIN ST
JOHN   SMITH    100 MAIN ST

我只希望重复数据而不是原始数据

2 个答案:

答案 0 :(得分:0)

您可以使用子查询查找其相关重复记录的min(id)(在您的示例中,使用 address 与其关联)。此 min(id)将是您原来的那个(我假设 id 是一个auto_increment PK)。因此,您可以使用id>此min(id)查找所有多余的重复记录,请参见以下示例:

CREATE TABLE `person` (
  `id` int not null auto_increment primary key,
  `firstname` VARCHAR(32),
  `lastname` VARCHAR(32),
  `address` VARCHAR(128)
);

INSERT INTO `person`
  (`firstname`, `lastname`, `address`)
VALUES
  ('Jim', 'Jones', '100 MAIN ST'),
  ('Jim', 'Smith', '100 MAIN ST'),
  ('John', 'Smith', '100 MAIN ST'),
  ('Alex', 'Smith', '23 Wall St'),
  ('Fox', 'Smith', '23 Wall St'),
  ('John', 'Smith', '100 main St');

SELECT id
,      firstname
,      lastname
,      address
FROM person p
WHERE id > (
    SELECT min(id) FROM person p1 
    WHERE p1.address = p.address
    GROUP BY p1.address
    HAVING count(*) > 1
)

对于示例数据,此SQL将返回第2、3、5、6行,因为我们仅使用 address 来检查重复项。您可以调整子查询以反映具有多个列的唯一约束,即地址+姓氏:

WHERE id > (
    SELECT min(id) FROM person p1 
    WHERE p1.address = p.address
    AND p1.lastname = p.lastname
    GROUP BY p1.address, p1.lastname
    HAVING count(*) > 1
)

答案 1 :(得分:0)

使用子查询尝试

select * from person
where (firstname
,      lastname
,      address) in (

select firstname
,      lastname
,      address from person
group by firstname
,      lastname
,      address having count(*)>1
)

输出

id  firstname   lastname    address
3   John        Smith      100 MAIN ST

6   John        Smith      100 main St

demo