MySQL حذف البيانات
-
23-09-2019 - |
سؤال
هذا يوضح لي جميع الأسماء الأولى والأسماء الأخيرة التي لها إدخالان بالضبط متطابقان
SELECT `firstname`,`lastname`,COUNT(*) AS Count
FROM `people`
GROUP BY `firstname`,`lastname`
HAVING Count = 2
كيف يمكنني تحويل هذا إلى حذف من حيث بيان مع حد لإزالة واحدة فقط من كل من الإدخالات وترك الآخر.
حسنًا ، يبدو أن هذا هو الطريق إلى التقنية ، سأقوم بذلك في PHP أثناء حلقة
المحلول
يمكنك إنشاء جدول مع سجل واحد لكل من التكرارات: ثم حذف جميع سجلات DUP من جدول People ثم إعادة إدراج سجلات DUP.
-- Setup for example
create table people (fname varchar(10), lname varchar(10));
insert into people values ('Bob', 'Newhart');
insert into people values ('Bob', 'Newhart');
insert into people values ('Bill', 'Cosby');
insert into people values ('Jim', 'Gaffigan');
insert into people values ('Jim', 'Gaffigan');
insert into people values ('Adam', 'Sandler');
-- Show table with duplicates
select * from people;
-- Create table with one version of each duplicate record
create table dups as
select distinct fname, lname, count(*)
from people group by fname, lname
having count(*) > 1;
-- Delete all matching duplicate records
delete people from people inner join dups
on people.fname = dups.fname AND
people.lname = dups.lname;
-- Insert single record of each dup back into table
insert into people select fname, lname from dups;
-- Show Fixed table
select * from people;
نصائح أخرى
إذا كان لديك مفتاح أساسي ، مثل ID ، يمكنك القيام بذلك:
delete from people
where id not in
(
select minid from
(select min(id) as minid from people
group by firstname, lastname) as newtable
)
الاسم الفرعي select min(id)...
BIT تحصل على صفوف فريدة (استنادًا إلى المعرف) لـ FirstName FirstName ، FastName Combination ؛ ثم تقوم بحذف جميع الصفوف الأخرى ، أي التكرارات الخاصة بك. تحتاج إلى لف مساعلك الفرعي بسبب وجود خطأ في MySQL ، وإلا يمكننا أن نفعل:
delete from people
where id not in
(
select min(id) as minid from people
group by firstname, lastname
)
الأفضل هو:
delete people from
people left outer join
(
select min(id) as minid from people
group by firstname, lastname
) people_grouped
on people.first_name = people_grouped.first_name
and people.last_name = people_grouped.last_name
and people_grouped.id is null
لتجنب الاسم الفرعي.
قم بإنشاء جدول جديد وأضف مفتاحًا فريدًا على (FirstName ، LastName). ثم أدخل الصفوف في الجدول القديم في الجدول الجديد. ثم إعادة تسمية الجداول.
mysql> select * from t;
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| A | B |
| A | B |
| X | Y |
+-----------+----------+
3 rows in set (0.00 sec)
mysql> create table t2 like t;
Query OK, 0 rows affected (0.00 sec)
mysql> alter table t2 add unique key name(firstname,lastname);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert ignore into t2 select * from t;
Query OK, 2 rows affected (0.00 sec)
Records: 3 Duplicates: 1 Warnings: 0
mysql> select * from t2;
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| A | B |
| X | Y |
+-----------+----------+
2 rows in set (0.01 sec)