根据 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 是数字数据类型,你不应该引用这个值)。