1つのフィールドのカウントが1より大きい場所を選択します


100

私はこのようなことをしたいです:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

MySqlでこれを実現するにはどうすればよいですか?

回答:


146

集計結果の比較にはHAVING、not WHERE句を使用します。

額面でのクエリの場合:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

理想的にGROUP BYは、HAVING句に適切な評価のための定義が必要ですが、MySQLではGROUP BY ...

これはの一意の制約の準備中someFieldですか?それはそうであるように見える...


11
GROUP BY確かに必要です(これが一部のMySQL非標準のものでない限り)?
マーティンスミス

@Martin Smith:額面どおりのクエリを取りました。GROUP BYの問題に対処しました(非表示列機能を含む)。
OMGポニー

「それはそうであるように見える...」なぜですか?私はこれに関する教育を必要としています:)
Dave

そのsomeFieldため、null以外の値が2つ以上含まれている場合はテーブル全体が返され、含まれていない場合は空の結果セットが返されます。
マーティンスミス

@Dave:不正なデータを定期的にチェックして修正しなければならない状況にあった場合、そもそも状況の発生を止めたくありませんか?MySQLは一意の制約をインデックスとして実装します。詳細については、CREATE INDEXのドキュメントを
OMGポニー

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
ここでの唯一の注意点(少なくとも5.1.46コミュニティのMySQL Community Server(GPL)の場合)は、「すべての派生テーブルに独自のエイリアスが必要」であるため、SQLは次のようになります。SELECT username、numb from(Select username、 count(username)as Customers from numb from GROUP BY username)as my_table WHERE numb> 3
D_K

14

これは自己結合でも実行できます。

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk



1

OMG Poniesが述べたように、having句はあなたが求めているものです。ただし、集計ではなく個別の行を取得することを希望している場合(「持つ」と集計が作成されます)-単一のステートメントでは実行できません。その場合、2つのステートメントを使用する必要があります。


1
完全に正しいわけではありません-GROUP BYを使用して、HAVINGが使用しているものを操作してください。
OMGポニー

1

SQLの2つのテーブル間のGroup Byの例を挙げます。

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

私にとっては、空の結果を返すだけでグループを持たない。だから、havingステートメントでグループを作ることはかなり重要だと思います


-2

また、「pk」がキーフィールドであることも言及する必要があります。自己結合

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

ビル・カーウィンによって、私が欲しかった重複であるすべてのレコードをあなたに与えます。いくつかは2つ以上あるため、同じレコードを複数回取得できます。同じフィールドを持つ別のテーブルにすべてを書き込んで、キーフィールドの抑制によって同じレコードを削除しました。私は試した

SELECT * FROM db.table HAVING COUNT(someField) > 1

上記の最初。そこから返されるデータは、重複の1つだけを提供します。これは、これが提供するものの1/2未満ですが、それが必要な場合は、カウントは適切です。


3
これは本当に答えではありません。
anon582847382 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.