выберите строки, в которых столбец содержит одинаковые данные в нескольких записях

28

У меня есть таблица с именем столбца article_title. Допустим, имя таблицы есть articles. Мне нужно выяснить записи, в которых article_titleданные совпадают на нескольких записях.

Вот что у меня есть:

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
источник

Ответы:

35

HAVING - отличный агрегатный фильтр. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ). Например, выберите article_titles с более чем вхождением:

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

Добавление столбцов в предложения SELECT и GROUP BY позволяет находить дубликаты на основе составного ключа из нескольких столбцов.

sqlreader
источник
2
@jkushner: но остерегайтесь причуд (или ошибок, как некоторые могут видеть это) в реализации MySQL GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name
4

Ваша проблема может быть решена с помощью этого запроса:

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);
Абхик Дей
источник
Это правильный ответ, потому что он на самом деле возвращает строки с дубликатами
etayluz
3

есть таблица, в которой есть столбец под названием article_title. Допустим, имя таблицы - статьи. Мне нужно выяснить записи, где данные article_title одинаковы для более чем одной записи.

Похоже, мне также нужно иметь идентификатор, потому что вы хотите найти записи на основе article_title потому что у вас есть дубликаты

Базовый MIN / MAX с GROUP BY (вы пропустите идентификаторы, когда более 2 дубликатов)

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
;

Или вернемся к денормализации, чтобы сгенерировать CSV для идентификаторов LIFO (старые идентификаторы дублируются), но вы знаете все идентификаторы здесь ..

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
;
Раймонд Нейланд
источник