我有下表(是的,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
但是这会按原样返回确切的表,并将消息总数作为第二列。我在做什么呢?
答案 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