mySQL 语句,用于查找带有尾部斜杠的几乎重复的数据



我有一个名为"LINK_INFO"的表,其中的URL位于名为"URL"的字段中。问题是,存在许多重复的 URL,除了一些使用尾随/来绕过唯一的字段要求。

例:

http://www.yahoo.com和http://www.yahoo.com/

我可以使用什么语句来选择这些近似重复的情况,以便我可以删除其中一个? 如果您能提供帮助,非常感谢。

您可以使用TRIM来查找所有唯一值;

SELECT DISTINCT TRIM(TRAILING '/' FROM url) url
FROM link_info

SQLfiddle 进行测试。

要立即删除重复项,只需执行删除联接即可;

DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE TRIM(TRAILING '/' FROM li1.url) =
      TRIM(TRAILING '/' FROM li2.url)
AND li1.id<li2.id

另一个用于测试的SQL小提琴。

在运行网络上找到的任意 SQL 之前,请务必备份您的表,即使是我的:)

编辑:如果您的数据库计算机受到限制,您可能希望使用索引来执行此操作,并避免加载到内存中不必要的内容;

-- remove all trailing slashes
UPDATE link_info 
SET url=TRIM(TRAILING '/' FROM url);
-- create an index on the resulting strings (if there isn't already one)    
CREATE INDEX url_index ON link_info(url);
-- delete all duplicates
DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE li1.url = li2.url
AND li1.id<li2.id;
-- drop the index if not needed anymore
DROP INDEX url_index ON link_info;

又是一把小提琴。

也许是这样的?

CREATE TABLE link_info (
  url varchar(255));
INSERT INTO link_info VALUES
('http://www.yahoo.com/'),
('http://www.yahoo.com');
SELECT DISTINCT
  CASE
    WHEN SUBSTRING(url, LENGTH(url)) = '/' 
      THEN LEFT(url, LENGTH(url) -1)
    ELSE url
  END AS `url`
FROM link_info

结果

|                 网址 |------------------------|http://www.yahoo.com |

观看演示

此时,您可以将其插入临时表,删除您的父项并重新填充。

最新更新