选择带有尾部斜杠的重复项附近

时间:2014-02-17 19:41:17

标签: mysql sql trim

我有一个大型的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

3 个答案:

答案 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添加的链接 联合

DEMO HERE

答案 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)