根据特定列中的前几个单词查找重复记录

时间:2017-09-28 14:46:07

标签: mysql database

我想在MySQL数据库中找到一些重复记录,具体取决于以下标准:

例如,有两条记录:

  1. Example text here 123 I am a news 1 duplicate text from any one
  2. Example text here 123 I am a news 1 duplicate text from any two
  3. 我尝试了以下内容,但它只返回完整的标题列匹配:

    SELECT title, COUNT(*) c FROM news_contents GROUP BY title HAVING c > 1
    

    如果前5个单词相同,我想要的是返回记录,例如上面的示例2记录:Example text here 123 I ...

    我试过这样的事情:

     SELECT
        title,
        COUNT(*) c
    FROM
        news_contents
    WHERE
        news_contents.title LIKE CONCAT(
            SUBSTRING_INDEX(news_contents.title, ' ', 4),
            '%'
        )
    GROUP BY
        title
    HAVING
        c > 1
    

    但上面是没有按预期返回结果,也许我错过了什么?我搜索了很多,但找不到任何东西。

2 个答案:

答案 0 :(得分:1)

可能正在寻找类似这样的东西,您可以通过获取前5个字符进行分组,然后将其与您的表格进行比较以获得所有匹配的记录。

SELECT LEFT(title,5) N, COUNT(*) C FROM news_contents GROUP BY LEFT(title,5) having COUNT(*) > 1

然后,为了获取您的数据,您可以将此结果与您的表格内连接:

SELECT * FROM news_content nc INNER JOIN (SELECT LEFT(title,5) N, COUNT(*) C FROM news_contents GROUP BY LEFT(title,5) having COUNT(*) > 1) NewsFiltered ON nc.title LIKE NewsFiltered.N + '%' 

它可能不是最有效的答案,但它确实有效。

答案 1 :(得分:1)

按标题分组不会起作用。如果要计算重复项,则需要按子串计数,如下所示:

SELECT CONCAT( SUBSTRING_INDEX(title, ' ', 4)) as pt, COUNT(*) c 
   FROM news_contents
   WHERE title LIKE CONCAT( SUBSTRING_INDEX(title, ' ', 4), '%') 
   GROUP BY pt HAVING c > 1

但是这不会给你每个重复的故事。为此,你需要做这样的事情:

SELECT news_contents.title FROM 
    (SELECT CONCAT( SUBSTRING_INDEX(title, ' ', 4)) as pt, COUNT(*) c 
        FROM news_contents
        WHERE title LIKE CONCAT( SUBSTRING_INDEX(title, ' ', 4), '%') 
        GROUP BY pt HAVING c > 1) d, stories 
    WHERE news_contents.title LIKE CONCAT(d.partial_title, '%') 

并且它会给出每个符合&#34的重复条目的每个确切标题;前四个单词是相同的"标准。