pilih baris tempat kolom berisi data yang sama di lebih dari satu catatan


28

Saya memiliki tabel yang memiliki kolom bernama article_title. Katakanlah nama tabelnya articles. Saya perlu mencari tahu catatan di mana article_titledatanya sama pada lebih dari satu catatan.

Inilah yang saya punya:

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)

Jawaban:


35

HAVING adalah filter agregat yang bagus. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Misalnya, pilih article_titles yang memiliki lebih dari pada kejadian:

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

Menambahkan kolom ke klausa SELECT dan GROUP BY memungkinkan Anda menemukan duplikat berdasarkan kunci komposit dari beberapa kolom.


2
@ jkushner: tapi waspadalah terhadap quirks (atau bug karena beberapa orang mungkin melihatnya) dalam implementasi MySQL dari GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name

4

Masalah Anda dapat diselesaikan dengan permintaan ini:

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

Ini adalah jawaban yang benar karena sebenarnya mengembalikan baris yang memiliki duplikat
etayluz

3

memiliki tabel yang memiliki kolom bernama article_title. Katakanlah nama tabel adalah artikel. Saya perlu mencari tahu catatan di mana data article_title sama pada lebih dari satu catatan.

Kedengarannya seperti saya, Anda juga perlu memiliki id karena Anda ingin menemukan catatan berdasarkan article_titlekarena Anda memiliki duplikat

MIN / MAX Dasar dengan GROUP BY (Anda akan kehilangan id saat lebih dari 2 duplikat)

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
;

Atau kembali ke denormalisasi untuk menghasilkan CSV untuk id LIFO (id lama dengan duplikat) tetapi Anda tahu semua id ada di sini ..

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
;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.