计算表中的唯一字符串

时间:2012-07-16 19:01:48

标签: mysql

我有下表(是的,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 个答案:

答案 0 :(得分:6)

您需要使用GROUP BY

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

答案 1 :(得分:1)

试试这个:

SELECT id_str AS id_str, COUNT(id) 
FROM messages group by id_str

答案 2 :(得分:1)

这将为您提供id_str的每个不同值的行数。请注意,这将计算所有行。

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

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

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

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

注意:您不需要DISTINCT关键字,GROUP BY子句可以满足您的需要。

您的查询相当于:

SELECT DISTINCT id_str, COUNT(id) FROM messages

DISTINCT关键字对SELECT列表中的所有表达式进行操作,而不仅仅是第一个表达式。第一个表达式周围的括号不会改变行为。 DISTINCT是保留字,它不是函数调用。您的查询中的AS id_str别名仅分配给id_str列,该列恰好包含在不必要的(但是合法的和允许的)括号中。

答案 3 :(得分:0)

你需要一个小组。

SELECT DISTINCT(id_str) AS id_str, COUNT(id) FROM messages GROUP BY id_str
相关问题