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
);