0

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

例子:

http://www.yahoo.comhttp://www.yahoo.com/

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

4

2 回答 2

1

您可以只使用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

另一个用于测试的 SQLfiddle

在运行网上找到的任意 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;

又一个SQLfiddle

于 2013-01-27T20:34:52.053 回答
0

也许是这样的?

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 |

查看演示

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

于 2013-01-27T20:27:11.757 回答