web-dev-qa-db-fra.com

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

J'ai une table qui a une colonne appelée article_title. Disons que le nom de la table est articles. Je dois trouver les enregistrements où le article_title les données sont les mêmes 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)
29
jkushner

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.

37
sqlreader

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);
8
Abhik Dey

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.

Il me semble que vous devez également avoir l'ID, car vous voulez trouver des enregistrements basés sur article_title parce que vous avez des doublons

Basic MIN/MAX 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 LIFO id's (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
;
3
Raymond Nijland