виберіть рядки, де стовпець містить однакові дані у більш ніж одному записі


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)

Відповіді:


35

HAVING - чудовий агрегатний фільтр. ( http://dev.mysql.com/doc/refman/5.6/uk/group-by-extensions.html ) Наприклад, виберіть статтю статті з більшою кількістю випадків:

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

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


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
;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.