DISTINCT値の出現回数を数える


218

特定のフィールドでDISTINCT値を見つけ、その値の出現回数を数え、その数で結果を並べ替えるMySQLクエリを見つけようとしています。

サンプルdb

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

期待される結果

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

回答:


395
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

2
ここでのグループとは正確には何ですか?目的とは何か明確ではないのですか?はっきりと読めばどこでもうまくいくはずです。
ジェームズ

19
アンバーの質問は質問に対する正しい答えですが、私は彼女のコメントを修正して、新しい人々を迷わせないようにしたいと思います。MySQLクエリで「group by」を省略した場合、[Mike、1]、[Mike、1]は取得されず、返される最初の行の名前とカウントになる単一の結果が取得されますテーブルの行数の、したがってこの場合[Mark、7]。count()。集計関数はデータセット全体で機能し、指定されたフィールドを1行に合計、カウント、または連結します。指定したフィールドの一意のコンボに基づいてデータセットをチャンクに細分化してグループ化
Avatar_Squadron

3
私が苦労したのは、重複のない結果を排除することでした。は集約関数なのでcount(*) > 1where節にスローすることはできません。また、「グループ関数の無効な使用」という非常に役に立たないメッセージも表示されます。正しい方法は、カウントにエイリアスを付けて、以下のようなhaving句name,COUNT(*) as cntを追加することですHAVING count > 1
Patrick M

4
@PatrickMはい、HAVING集計後に適用する必要がある条件用ですが、集計WHERE前に適用する必要がある条件用です。(これについての別の考え方はWHERE、元の行データにHAVING適用されるものです。出力行データに適用されます。)
2013年

2
よく構成されたSQLステートメントには、非常に満足できるものがあります。
Joshua Pinter、2014年

14

このようなものはどうですか:

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

名前と表示回数を選択していますが、名前でグループ化しているため、各名前は1回だけ選択されます。

最後に、DESCの降順で回数順に並べ、最も頻繁に表示されるユーザーが最初に来るようにします。


あなたの質問は私を助けました。結果として数行を返します。この結果の数を見つける方法も知りたいと思っていました。いくつかのクエリを試してみましたが、集計を数えることができないようです。お手伝いできますか?
ナビ

@Nav-何のカウント?返された行数は?ことをSELECT COUNT(DISTINCT name) as count FROM your_tableテーブルの総行数については、なしパスカルのクエリを実行group by声明。
Autumn Leonard、

毎分違いは何ですか!
チャックルバット

6

パフォーマンスを向上させるために、アンバーのCOUNT(*)をCOUNT(1)に変更しました。

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

1
実際、あなたが言ったことはここで
ジェームズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.