wybierz wiersze, w których kolumna zawiera te same dane w więcej niż jednym rekordzie

28

Mam tabelę z kolumną o nazwie article_title. Powiedzmy, że nazwa tabeli to articles. Muszę znaleźć rekordy, w których article_titledane są takie same w więcej niż jednym rekordzie.

Oto co mam:

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
źródło

Odpowiedzi:

35

HAVING to świetny filtr agregujący. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Na przykład wybierz tytuł_artykułów z więcej niż przy wystąpieniu:

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

Dodanie kolumn do klauzul SELECT i GROUP BY pozwala zlokalizować duplikaty na podstawie klucza złożonego z wielu kolumn.

sqlreader
źródło
2
@jkushner: ale uważaj na dziwactwa (lub błędy, jak niektórzy mogą to zobaczyć) w implementacji MySQL GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name
4

Twój problem można rozwiązać za pomocą tego zapytania:

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
źródło
To poprawna odpowiedź, ponieważ faktycznie zwraca wiersze, które mają duplikaty
etayluz,
3

mieć tabelę z kolumną o nazwie article_title. Powiedzmy, że nazwa tabeli to artykuły. Muszę znaleźć rekordy, w których dane tytuł artykułu są takie same na więcej niż jednym rekordzie.

Brzmi jak dla mnie, musisz także mieć identyfikator, ponieważ chcesz znaleźć rekordy na podstawie, article_titleponieważ masz duplikaty

Podstawowe MIN / MAX z GROUP BY (przegapisz id, gdy więcej niż 2 duplikaty)

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
;

Lub wróć do denormalizacji, aby wygenerować plik CSV dla identyfikatora LIFO (starszy identyfikator przez duplikaty), ale wiesz, że wszystkie identyfikatory są tutaj ...

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
źródło