根据 mysql 5.7 中的某些条件,从 table 中删除重复行
remove duplicate rows from a table given certain criteria in mysql 5.7
我有一本名为 books 的 table,行如下:
+----+----------+---------+--------+-----------+
Id PNo Gid Genre Trailer
+----+----------+---------+--------+------------+
1 1234567 55 NULL NULL
2 1234567 64 Fiction NULL
3 8763525 64 Fiction NULL
4 8763525 73 Fiction NULL
5 5555555 18 Fiction NULL
6 5555555 64 Fiction NULL
+---------------------------------------------------
我需要做的是:
我想删除所有具有重复数据的行,基于 PNo 列,并且 Gid 值 = 64,而且 Pno 不是 5555555
以下查询 returns 我需要的结果(重复行),但我需要知道如何根据上述标准进行删除:
SELECT
COUNT(*) as repetitions,
group_concat(PNo, ' (', Gid, ', ', Genre, ') ' SEPARATOR ' | ')
as row_data
FROM books
GROUP BY PNo
HAVING repetitions > 1;
DELETE m1 FROM books m1
INNER JOIN books m2
ON m1.PNo = m2.PNo
WHERE m1.PNo = '64' AND m1.PNo != 5555555
以上将删除所有具有 m1.PNo = '64' 的行,当我只需要删除重复行时,基于 PNo 列的值,该列中也有Gid 值 64。我的删除查询应该如何?
您快完成了:您只需要一个条件来避免记录可以与其自身连接。假设 id
是 table 的主键(或至少是唯一键),您可以:
delete m1
from books m1
inner join books m2 on m1.pno = m2.pno and m1.id <> m2.id
where m1.gid = 64 and m1.pno != 5555555
注意:我认为您的 where
子句中存在一个小故障,其中 m1.PNo = '64'
应该是 m1.gid = 64
(另外,如果 gid
是数字数据类型,你不应该引用这个值)。
我有一本名为 books 的 table,行如下:
+----+----------+---------+--------+-----------+
Id PNo Gid Genre Trailer
+----+----------+---------+--------+------------+
1 1234567 55 NULL NULL
2 1234567 64 Fiction NULL
3 8763525 64 Fiction NULL
4 8763525 73 Fiction NULL
5 5555555 18 Fiction NULL
6 5555555 64 Fiction NULL
+---------------------------------------------------
我需要做的是: 我想删除所有具有重复数据的行,基于 PNo 列,并且 Gid 值 = 64,而且 Pno 不是 5555555
以下查询 returns 我需要的结果(重复行),但我需要知道如何根据上述标准进行删除:
SELECT
COUNT(*) as repetitions,
group_concat(PNo, ' (', Gid, ', ', Genre, ') ' SEPARATOR ' | ')
as row_data
FROM books
GROUP BY PNo
HAVING repetitions > 1;
DELETE m1 FROM books m1
INNER JOIN books m2
ON m1.PNo = m2.PNo
WHERE m1.PNo = '64' AND m1.PNo != 5555555
以上将删除所有具有 m1.PNo = '64' 的行,当我只需要删除重复行时,基于 PNo 列的值,该列中也有Gid 值 64。我的删除查询应该如何?
您快完成了:您只需要一个条件来避免记录可以与其自身连接。假设 id
是 table 的主键(或至少是唯一键),您可以:
delete m1
from books m1
inner join books m2 on m1.pno = m2.pno and m1.id <> m2.id
where m1.gid = 64 and m1.pno != 5555555
注意:我认为您的 where
子句中存在一个小故障,其中 m1.PNo = '64'
应该是 m1.gid = 64
(另外,如果 gid
是数字数据类型,你不应该引用这个值)。