从给定特定条件的mysql 5.7中删除表中的重复行

问题描述 投票:0回答:1

我有一张桌子,叫书,有这样的行:

+----+----------+---------+--------+-----------+
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

以下查询向我返回了我需要的结果(重复的行),但是我还需要知道如何根据上述标准进行删除:

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。我的删除查询应该如何?

mysql sql sql-delete mysql-5.7
1个回答
1
投票

您几乎在那里:您只需要一个条件,该条件可以避免将记录与自身连接。假设id是表的主键(或至少是唯一键),则可以执行以下操作:

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

© www.soinside.com 2019 - 2024. All rights reserved.