【问题标题】:select near duplicates with trailing slashes选择带有斜杠的附近重复项
【发布时间】:2014-02-17 19:41:16
【问题描述】:

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

【问题讨论】:

  • 您是要选择重复项还是获取不同的列表?对于重复项,我认为您想使用 GROUP BYHAVING COUNT(*) > 1
  • 所以想要的输出只有 1 行,yahoo.com,count = 2?不是 100% 清楚您想要的输出是什么。
  • @AgRizza 最初我想同时选择两者,但只返回 1 个重复项也可以。

标签: mysql sql trim


【解决方案1】:

您的查询将返回每个修剪过的网址。我认为你需要这样的东西:

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/ 中删除尾部斜杠

【讨论】:

  • 呵呵,你用了我的小提琴 :) ,但是这个解决方案是错误的,他也想要谷歌,
  • @echo_Me 我剪切并粘贴了代码,所以它恰好是同一个小提琴:) 但我不认为 OP 想要谷歌,因为它们是两个不同的 url,两个雅虎 url 都是一样的,所以它们需要退货
  • 我认为他想在 google 之后删除链接并返回一个与 google 的链接作为重复链接。
  • @fthiella 你说得对,我想返回雅虎网址。 echo_Me 哈哈是的,我用了你的小提琴。
  • 如果我想在之后删除选定的重复项,是否要更新? Update TRIM(TRAILING '/' FROM url) trimmed_url FROM link_info GROUP BY trimmed_url HAVING COUNT(DISTINCT url)>1
【解决方案2】:

你可以用这个

 SELECT  TRIM(TRAILING '/' FROM url) url
 FROM link_info
 group by SUBSTRING_INDEX(url, '.com', 1)

但这仅适用于具有 .com 的链接,因此使用 .net.something 您添加 联合

DEMO HERE

【讨论】:

    【解决方案3】:

    试试:

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2018-07-26
      • 2015-06-21
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多