seleccionar filas donde la columna contiene los mismos datos en más de un registro

28

Tengo una tabla que tiene una columna llamada article_title. Digamos que el nombre de la tabla es articles. Necesito encontrar los registros donde los article_titledatos son los mismos en más de un registro.

Esto es lo que tengo:

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
fuente

Respuestas:

35

Tener es un gran filtro agregado. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Por ejemplo, seleccione el artículo_títulos con más de una vez:

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

Agregar columnas a las cláusulas SELECT y GROUP BY le permite ubicar duplicados basados ​​en una clave compuesta de múltiples columnas.

sqlreader
fuente
2
@jkushner: pero tenga cuidado con las peculiaridades (o errores que algunos pueden ver) en la implementación de MySQL de GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name
4

Su problema se puede resolver con 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
fuente
Esta es la respuesta correcta porque en realidad devuelve las filas que tienen los duplicados
etayluz
3

tener una tabla que tenga una columna llamada article_title. Digamos que el nombre de la tabla es artículos. Necesito encontrar los registros donde los datos de article_title son los mismos en más de un registro.

A mí me parece que también necesitas tener la identificación porque quieres encontrar registros basados ​​en article_titleporque tienes duplicados

MIN / MAX básico con GROUP BY (se perderán las identificaciones cuando haya más de 2 duplicados)

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
;

O regrese a la desnormalización para generar un CSV para los ID de LIFO (ID más antiguos por duplicado) pero ya conoce todos los ID aquí.

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
fuente