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

但这会按原样返回确切的表格,消息总数作为第二列。我在拧什么?

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

如果您只想计算给定表达式不为空的行(例如,whereid不为空),则可以将 COUNT 聚合应用于该表达式。只有表达式具有非 NULL 值的行才会包含在计数中(因此,在某些情况下,实际上可能返回零计数):

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

(当然,如果id保证列不为空,那么这两个将返回相同的结果。)

注意:您不需要 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

你需要一个group by。

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