我有一个名为books的表,其行如下:
+----+----------+---------+--------+-----------+
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 。我的删除查询应该如何?
答案 0 :(得分: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
是数字数据类型,则您不应引用该值)。