我刚刚插入了新的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
);