sütunun birden fazla kayıtta aynı verileri içerdiği satırları seçin


28

Bir sütunu olan bir tablo var article_title. Diyelim ki tablo adı articles. article_titleBirden fazla kayıtta verinin aynı olduğu kayıtları bulmam gerekiyor .

İşte elimde ne var:

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)

Yanıtlar:


35

HAVING harika bir filtredir. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Örneğin, meydana gelenden daha fazla olan article_titles öğesini seçin:

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

SELECT ve GROUP BY deyimlerine sütun ekleme, birden fazla sütun içeren bir bileşik anahtara dayalı kopyaları bulmanıza izin verir.


2
@jkushner: ama MySQL'in aşağıdakileri uygulamasındaki tuhaflıklara (ya da bazılarının görebileceği gibi) dikkat edin GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name 30:13

4

Sorununuz bu sorgu ile çözülebilir:

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

Bu doğru cevap, çünkü yinelenen kopyalara sahip olan satırları döndürüyor
etayluz

3

article_title adlı bir sütunu olan bir tablo var. Diyelim ki tablo adı makaleler. Article_title verilerinin birden fazla kayıtta aynı olduğu kayıtları bulmam gerekiyor.

Kulağa hoş geldin gibi kimliğe de ihtiyacın var, çünkü article_titleyinelemelerin olduğu için kayıtları bulmak istiyorsun

GROUP BY ile temel MIN / MAX (2 kopyadan sonra kimlikleri özleyeceksiniz)

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
;

Ya da LIFO ID'leri için bir CSV oluşturmak için denormalizasyona geri dönün (eski id'ler çiftler halinde), fakat tüm kimlikleri burada biliyorsunuz ..

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
;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.