seleziona le righe in cui la colonna contiene gli stessi dati in più di un record


28

Ho una tabella che ha una colonna chiamata article_title. Diciamo che il nome della tabella è articles. Devo scoprire i record in cui i article_titledati sono gli stessi su più di un record.

Ecco cosa ho:

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)

Risposte:


35

HAVING è un ottimo filtro aggregato. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Ad esempio, selezionare article_titles con più che occorrenza:

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

L'aggiunta di colonne alle clausole SELECT e GROUP BY consente di individuare i duplicati in base a una chiave composita di più colonne.


2
@jkushner: ma attenzione alle stranezze (o bug che alcuni potrebbero vederlo) nell'implementazione di MySQL di GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name

4

Il tuo problema può essere risolto con questa query:

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);

Questa è la risposta corretta perché in realtà restituisce le righe che hanno i duplicati
etayluz

3

avere una tabella che ha una colonna chiamata article_title. Diciamo che il nome della tabella è articoli. Devo scoprire i record in cui i dati article_title sono gli stessi su più di un record.

A me sembra che tu abbia anche l'ID perché vuoi trovare i record in base al article_titlefatto che hai duplicati

MIN / MAX di base con GROUP BY (ti mancheranno gli ID quando più di 2 duplicati)

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 torniamo alla denormalizzazione per generare un CSV per ID LIFO (ID più vecchio con duplicati) ma sai che tutti gli ID sono qui.

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
;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.