我有一个大型的URL数据库,我有来自尾部斜杠的重复项。我想找到以尾部斜杠结尾的那些重复值,但是在尾部斜杠之后找不到带文本的网址,例如http://www.google.com/asdfasdf
CREATE TABLE link_info (
id INT,
url VARCHAR(32)
);
INSERT INTO link_info VALUES
(1, 'http://www.yahoo.com/'),
(2, 'http://www.google.com/'),
(3, 'http://www.google.com/asdfasdf'),
(4, 'http://www.yahoo.com');
我正在尝试选择没有尾部斜杠的重复项,但它会选择http://www.google.com/asdfasdf
作为副本。
SELECT DISTINCT TRIM(TRAILING '/' FROM url) url
FROM link_info
我希望使用正则表达式,但这不起作用。
SELECT DISTINCT TRIM(TRAILING REGEXP('[/]$') FROM url) url
FROM link_info
答案 0 :(得分:2)
您的查询将返回修剪过的每个网址。我想你需要这样的东西:
SELECT TRIM(TRAILING '/' FROM url) trimmed_url
FROM link_info
GROUP BY trimmed_url
HAVING COUNT(DISTINCT url)>1
请参阅小提琴here。
修改强>
如果没有确切的重复项,并且您只想保留没有尾部斜杠的行,则可以使用此删除查询:
DELETE l1.*
FROM
link_info l1 INNER JOIN link_info l2
ON l1.url = CONCAT(l2.url, '/')
请参阅小提琴here。请注意,此查询只会删除带有斜杠的重复yahoo.com,但它不会从www.google.com /
中删除尾部斜杠答案 1 :(得分:1)
你可以使用这个
SELECT TRIM(TRAILING '/' FROM url) url
FROM link_info
group by SUBSTRING_INDEX(url, '.com', 1)
但这仅适用于.com
与.net
或.something
添加的链接
联合
答案 2 :(得分:1)
尝试:
select *
from link_info
where url in
(select url
from link_info
group by case
when replace(url, substring_index(url, '.', 1), '') like '%/' then
replace(url, substring_index(url, '.', 1), '')
else
concat(replace(url, substring_index(url, '.', 1), ''),
'/')
end
having count(*) > 1)