列に複数のレコードの同じデータが含まれる行を選択する


28

という列があるテーブルがありますarticle_title。テーブル名がであるとしましょうarticlesarticle_titleデータが複数のレコードで同じであるレコードを見つける必要があります。

ここに私が持っているものがあります:

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)

回答:


35

HAVINGは優れた集約フィルターです。(http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html)たとえば、複数回出現するarticle_titlesを選択します。

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

SELECT句とGROUP BY句に列を追加すると、複数の列の複合キーに基づいて重複を見つけることができます。


2
@jkushner:しかし、(一部はそれを見ることができるとして、あるいはバグ)のMySQLの実装に癖の用心GROUP BYmysqlperformanceblog.com/2006/09/06/...
a_horse_with_no_name

4

問題は次のクエリで解決できます。

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

それは実際に重複を持つ行を返すので、これは正しい答えである
etayluz

3

article_titleという列を持つテーブルがあります。テーブル名がarticlesだとしましょう。article_titleデータが複数のレコードで同じであるレコードを見つける必要があります。

article_title重複しているために基づいてレコードを検索したいので、IDも必要です

GROUP BYを使用した基本的なMIN / MAX(2回以上重複するとidが失われます)

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
;

または、非正規化に戻ってLIFO ID(重複する古いID)のCSVを生成しますが、ここですべてのIDを知っています。

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
;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.