1

私は次のテーブルを持っています(はい、id_strはテキストとしてフォーマットされた整数です):

messages
-------------------------
id (INT) id_str (VARCHAR)
-------------------------
1        3245346543343247
2        3245346543343247
3        3245346543343247
4        1214354546578886
5        9979679595696599
6        9979679595696599

必要な出力は、すべての一意のid_strのカウントです。

id_str            cnt
---------------------
3245346543343247  3
1214354546578886  1
9979679595696599  2

私は次のクエリでこれを達成しようとしています:

SELECT DISTINCT(id_str) AS id_str, COUNT(id) FROM messages

ただし、これは正確なテーブルをそのまま返し、メッセージの総数を2番目の列として返します。私は何をしているのですか?

4

4 に答える 4

6

使用する必要がありますGROUP BY

SELECT id_str, COUNT(id) as cnt
FROM messages
GROUP BY id_str
于 2012-07-16T19:03:30.370 に答える
1

これを試して:

SELECT id_str AS id_str, COUNT(id) 
FROM messages group by id_str
于 2012-07-16T19:04:38.107 に答える
1

これにより、id_str の個別の値ごとに行数が得られます。これにより、すべての行がカウントされることに注意してください。

SELECT id_str, COUNT(1) AS cnt FROM messages GROUP BY id_str

特定の式が null ではない行のみをカウントしたい場合 (たとえば、 whereidが null ではない)、その式に COUNT 集計を適用できます。式に NULL 以外の値を持つ行のみがカウントに含まれます (そのため、いくつかの条件下では、実際にゼロのカウントを返す可能性があります)。

SELECT id_str, COUNT(id) AS cnt FROM messages GROUP BY id_str

(もちろん、id列が NOT NULL であることが保証されている場合、これら 2 つは同じ結果を返します。)

注: DISTINCT キーワードは必要ありません。GROUP BY 句が必要なことを行います。

クエリは次と同等です。

SELECT DISTINCT id_str, COUNT(id) FROM messages

DISTINCT キーワードは、最初の式だけでなく、SELECT リスト内のすべての式に作用します。最初の式を括弧で囲んでも、動作は変わりません。 DISTINCTは予約語であり、関数呼び出しではありません。クエリのAS id_strエイリアスは id_str 列だけに割り当てられていますが、これはたまたま不要な (ただし合法で許可されている) 括弧で囲まれています。

于 2012-07-16T19:05:21.333 に答える
0

グループ化が必要です。

SELECT DISTINCT(id_str) AS id_str, COUNT(id) FROM messages GROUP BY id_str
于 2012-07-16T19:02:55.013 に答える