sélectionner les lignes où la colonne contient les mêmes données dans plusieurs enregistrements

28

J'ai une table qui a une colonne appelée article_title. Disons que le nom de la table est articles. J'ai besoin de trouver les enregistrements où les article_titledonnées sont identiques sur plusieurs enregistrements.

Voici ce que j'ai:

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
la source

Réponses:

35

AVOIR est un excellent filtre global. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Par exemple, sélectionnez les titres_article avec plus que sur occurrence:

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

L'ajout de colonnes aux clauses SELECT et GROUP BY vous permet de localiser les doublons en fonction d'une clé composite de plusieurs colonnes.

sqlreader
la source
2
@jkushner: mais méfiez-vous des bizarreries (ou des bugs comme certains le voient) dans l'implémentation de MySQL de GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name
4

Votre problème peut être résolu avec cette requête:

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
la source
C'est la bonne réponse car elle retourne en fait les lignes qui ont les doublons
etayluz
3

avoir une table qui a une colonne appelée article_title. Disons que le nom de la table est des articles. J'ai besoin de trouver les enregistrements où les données article_title sont les mêmes sur plusieurs enregistrements.

J'ai l'impression que vous devez également avoir l'ID parce que vous voulez trouver des enregistrements en fonction de article_titlevos doublons

MIN / MAX de base avec GROUP BY (vous manquerez les identifiants lorsque plus de 2 doublons)

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
;

Ou revenons à la dénormalisation pour générer un CSV pour les identifiants LIFO (anciens identifiants par doublons) mais vous connaissez tous les identifiants ici ..

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
la source