SQL 如果查询 returns 超过 2 行则删除
SQL delete if query returns more than 2 rows
我刚刚插入了新的url,我想删除旧的
我需要检查是否有2个相同的,如果是,请删除旧的。
如果只有一个,什么也不做。
DELETE FROM files
WHERE url
IN (SELECT id FROM files WHERE url='$url' ORDER BY date ASC LIMIT 1)
我收到这个错误:
#1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
你能帮帮我吗?谢谢
首先,您需要获取重复的网址,然后使用 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
);
我刚刚插入了新的url,我想删除旧的
我需要检查是否有2个相同的,如果是,请删除旧的。
如果只有一个,什么也不做。
DELETE FROM files
WHERE url
IN (SELECT id FROM files WHERE url='$url' ORDER BY date ASC LIMIT 1)
我收到这个错误:
#1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
你能帮帮我吗?谢谢
首先,您需要获取重复的网址,然后使用 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
);