我有一个名为“LINK_INFO”的表,其中包含一个名为“URL”的字段中的 URL。问题是,除了一些使用尾随 / 来绕过唯一字段要求的 URL 之外,存在许多重复的 URL。
例子:
http://www.yahoo.com 和 http://www.yahoo.com/
我可以使用什么语句来选择这些几乎重复的情况,以便我可以删除其中一个?非常感谢您能提供帮助。
我有一个名为“LINK_INFO”的表,其中包含一个名为“URL”的字段中的 URL。问题是,除了一些使用尾随 / 来绕过唯一字段要求的 URL 之外,存在许多重复的 URL。
例子:
http://www.yahoo.com 和 http://www.yahoo.com/
我可以使用什么语句来选择这些几乎重复的情况,以便我可以删除其中一个?非常感谢您能提供帮助。
您可以只使用TRIM
来查找所有唯一值;
SELECT DISTINCT TRIM(TRAILING '/' FROM url) url
FROM link_info
要立即删除重复项,只需执行删除连接;
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 之前,请务必备份您的表,即使是我的 :)
编辑:如果您的数据库机器有限,您可能希望使用索引来执行此操作,并避免将更多内容加载到内存中;
-- 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。
也许是这样的?
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 |
此时您可以将其插入临时表中,删除您的父级并重新填充。