MySQL yanlışlıkla değil nerede sil

Böyle bir masam var:

create table person (
  id integer,
  Email varchar(100)
);


insert into person values (1, '[email protected]');
insert into person values (2, '[email protected]');
insert into person values (3, '[email protected]');
insert into person values (4, '[email protected]');

Şimdi, yinelenen satırları silmeye ihtiyacım var min Id tutar, yani tabloyu sildikten sonra:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+

Yinelenmeyen bir kimlik listesi almak için bunu aldım:

select Id from Person group by Email;

Ve kodu sil:

delete from Person
  where Person.Id not in 
    (select Id from Person group by Email);

Ama benim için işe yaramıyor, neden böyle yazamıyorum ve nasıl düzeltebilirim?

0

7 cevap

JOIN ile kolayca yapabilirsiniz.

delete p from person p 
join ( 
  select min(id) as id ,email from person group by email 
)p1 
on p1.id < p.id and p1.Email = p.Email ;
1
katma
Fakat neden sadece id değil, min (id) kimliğimi id olarak eklemek zorunda olduğumu bilmiyorum, lütfen bana söyler misiniz?
katma yazar color-blind, kaynak
Bunun için id adlı bir takma ad ekliyorum, böylece katılma kısmında daha anlamlı bir şekilde kullanabilirim. Şimdi mantık şu ki, grup için min-id'yi e-posta ile alıyorum, böylece silme işleminden sonra onları tutabilirim.
katma yazar Abhik Chakraborty, kaynak

JOIN ile kolayca yapabilirsiniz.

delete p from person p 
join ( 
  select min(id) as id ,email from person group by email 
)p1 
on p1.id < p.id and p1.Email = p.Email ;
1
katma
Fakat neden sadece id değil, min (id) kimliğimi id olarak eklemek zorunda olduğumu bilmiyorum, lütfen bana söyler misiniz?
katma yazar color-blind, kaynak
Bunun için id adlı bir takma ad ekliyorum, böylece katılma kısmında daha anlamlı bir şekilde kullanabilirim. Şimdi mantık şu ki, grup için min-id'yi e-posta ile alıyorum, böylece silme işleminden sonra onları tutabilirim.
katma yazar Abhik Chakraborty, kaynak

Bu sorgu yinelenen tüm satırları siler ve en düşük kimliğe sahip olanı tutar:

DELETE p1.*
FROM
  person p1 INNER JOIN person p2
  ON p1.Email=p2.Email
     AND p1.id>p2.id

Lütfen burayı çalıştığını görün.

0
katma

Bu sorgu yinelenen tüm satırları siler ve en düşük kimliğe sahip olanı tutar:

DELETE p1.*
FROM
  person p1 INNER JOIN person p2
  ON p1.Email=p2.Email
     AND p1.id>p2.id

Lütfen burayı çalıştığını görün.

0
katma

Bunun aradığınızı vereceğine inanıyorum:

delete from Person
  where Person.Id not in 
    (select MIN(Id) from Person group by Email);
0
katma

Russ ile aynı fikirdeyim.

First you should go edit>preferences>sql editor and uncheck the safe update box. Then select the query>reconnect to server. Finally run the following query.

delete from Person
  where Person.Id not in 
 (select id from (select MIN(Id) as id from person group by email) as p)
0
katma

Russ ile aynı fikirdeyim.

First you should go edit>preferences>sql editor and uncheck the safe update box. Then select the query>reconnect to server. Finally run the following query.

delete from Person
  where Person.Id not in 
 (select id from (select MIN(Id) as id from person group by email) as p)
0
katma