Zeilen auswählen, in denen Spalte dieselben Daten in mehr als einem Datensatz enthält


28

Ich habe eine Tabelle mit einer Spalte namens article_title. Angenommen, der Tabellenname lautet articles. Ich muss die Datensätze herausfinden, bei denen die article_titleDaten in mehr als einem Datensatz identisch sind.

Folgendes habe ich:

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)

Antworten:


35

HAVING ist ein großartiger Aggregatfilter. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Wählen Sie beispielsweise die article_titles mit mehr als beim Auftreten:

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

Durch Hinzufügen von Spalten zu den Klauseln SELECT und GROUP BY können Sie Duplikate auf der Grundlage eines zusammengesetzten Schlüssels aus mehreren Spalten suchen.


2
@jkushner: aber hüte dich vor den Macken (oder Fehlern, wie manche vielleicht sehen) in MySQLs Implementierung von GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name 30.11.13

4

Ihr Problem kann mit dieser Abfrage gelöst werden:

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);

Dies ist die richtige Antwort, da sie tatsächlich die Zeilen mit den Duplikaten
zurückgibt

3

Haben Sie eine Tabelle mit einer Spalte namens article_title. Nehmen wir an, der Tabellenname ist Artikel. Ich muss die Datensätze herausfinden, in denen die article_title-Daten in mehr als einem Datensatz identisch sind.

Klingt für mich so, als ob Sie auch die ID benötigen, weil Sie Datensätze suchen möchten, die auf article_titleDuplikaten basieren

Grundlegendes MIN / MAX mit GROUP BY (Sie werden IDs verpassen, wenn mehr als 2 Duplikate vorhanden sind)

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
;

Oder zurück zur Denormalisierung, um eine CSV für LIFO-IDs zu generieren (ältere IDs durch Duplikate), aber Sie kennen alle IDs hier.

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
;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.