selecione linhas em que a coluna contém os mesmos dados em mais de um registro

28

Eu tenho uma tabela que tem uma coluna chamada article_title. Digamos que o nome da tabela seja articles. Preciso descobrir os registros em que os article_titledados são iguais em mais de um registro.

Aqui está o que eu tenho:

select a.* 
from articles a 
where a.article_title = (select article_title 
                         from articles 
                         where article_title = a.article_title 
                         AND a.id <> articles.id)
jkushner
fonte

Respostas:

35

HAVING é um ótimo filtro agregado. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Por exemplo, selecione os article_titles com mais ocorrências:

SELECT count(*), article_title
FROM articles
GROUP BY article_title
HAVING COUNT(*) > 1;

A adição de colunas nas cláusulas SELECT e GROUP BY permite localizar duplicatas com base em uma chave composta de várias colunas.

sqlreader
fonte
2
@jkushner: mas cuidado com as peculiaridades (ou bugs como alguns podem vê-lo) na implementação do MySQL de GROUP BY: mysqlperformanceblog.com/2006/09/06/...
a_horse_with_no_name
4

Seu problema pode ser resolvido com esta consulta:

SELECT *
FROM article
WHERE article_title IN (SELECT *
                        FROM (SELECT article_title
                              FROM article
                              GROUP BY article_title
                              HAVING COUNT(article_title) > 1)
                        AS a);
Abhik Dey
fonte
Esta é a resposta correta, pois na verdade retorna as linhas que têm as duplicatas
etayluz 5/18/18
3

tenha uma tabela que tenha uma coluna chamada article_title. Digamos que o nome da tabela seja artigos. Preciso descobrir os registros em que os dados do article_title são iguais em mais de um registro.

Parece-me que você também precisa ter o ID porque deseja encontrar registros com base em article_titleduplicatas.

MIN / MAX básico com GROUP BY (você perderá identificações quando mais de duas duplicatas)

SELECT 
  MIN(id) -- for FIFO id's (first id by duplicate)
, MAX(id) -- for LIFO id's (last id by duplicate)
, article_title
, COUNT(*)  
FROM
 articles
WHERE -- Maybe to filter out '' or IS NOT NULL
 article_title != '' AND article_title IS NOT NULL
GROUP BY
 article_title ASC
HAVING
 COUNT(*) >= 2
;

Ou volte para a desnormalização para gerar um CSV para IDs LIFO (IDs antigos por duplicatas), mas você sabe todos os IDs aqui.

SELECT 
  GROUP_CONCAT(id ORDER BY ASC SEPARATOR ',') -- change to DESC if want the last record first
, article_title
, COUNT(*)  
FROM
 articles
GROUP BY
 article_title ASC
HAVING
 COUNT(*) >= 2
;
Raymond Nijland
fonte