如果查询返回2行以上,则SQL删除



我刚刚插入了新的url,我想删除旧的url。

我需要检查是否有2个相同的,如果有,删除旧的。

如果只有一个,什么也不做。

DELETE FROM files
WHERE url
IN (SELECT id FROM files WHERE url='$url' ORDER BY date ASC LIMIT 1)

我得到这个错误:

#1235-这个版本的MariaDB还不支持'LIMIT&IN/ALL/AANY/SOME子查询'

你能帮我吗?谢谢

首先需要获得重复的url,然后使用Row_Number()找到它的第一个Id,如下所示:


DELETE FROM files
WHERE id IN (
SELECT t.id
FROM
(
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY url ORDER BY date ASC) rw
FROM files
WHERE url IN (
SELECT url
FROM files
GROUP BY url
HAVING COUNT(*) > 1
)
) t
WHERE t.rw = 1
)

任务相当简单:您想要删除存在较新条目的文件。

DELETE FROM files
WHERE EXISTS
(
SELECT NULL
FROM files newer
WHERE newer.url = files.url AND newer.date > files.date
);

支持这一说法的索引如下:

CREATE INDEX idx ON files (url, date);

以上将是我的首选方法。当然,还有其他方法。例如:

DELETE FROM files
WHERE (url, date) NOT IN
(
SELECT url, MAX(date)
FROM files
GROUP BY url
);

同样的索引也有助于这一说法。

无论一个URL有两个条目还是数百个条目,这两个语句都会删除所有重复项。

然而,如果这真的只是删除最旧的行(因为一个URL不能有两个以上的条目,或者因为你想保留除了最旧的条目之外的重复项(,这会更快:

DELETE FROM files
WHERE (url, date) IN
(
SELECT url, MIN(id)
FROM files
-- WHERE url = @url -- add this, if this is only about one URL
GROUP BY url
HAVING COUNT(*) > 1
);

最新更新