SQL行计数

时间:2012-04-28 13:16:57

标签: mysql sql

在继续之前,我不想使用任何涉及选择所有行并手动计算出现次数的查询。顺便说一句,我在PHP中这样做。

基本上,我有一张禁令表。每个新记录/行都是新的禁令。标题为user_name的字段表示哪个玩家被禁止。有没有办法统计谁在这张桌子上有最多的禁令?我真的不想选择每一行,然后为每个玩家计算出来。该表非常大,因此使上述解决方案不切实际且效率低下。

3 个答案:

答案 0 :(得分:4)

这是通过COUNT()聚合完成的,按user_name进行分组。

禁止用户从最多到最少:

SELECT
  user_name,
  COUNT(*) as numbans
FROM bans
GROUP BY user_name
/* ordered by number of bans from greatest to least */
ORDER BY numbans DESC

仅获取最被禁用的用户:

SELECT
  user_name,
  COUNT(*) as numbans
FROM bans
GROUP BY user_name
ORDER BY numbans DESC
/* adjust LIMIT for how many records you want returned -- 1 gives only the first record */
LIMIT 1

在你的问题中,你非常担心不想在PHP中手动计算。请注意,这只是从不必要。 RDBMS系统是专门为组织和查询数据而设计的,非常擅长有效地完成这样的任务。阅读MySQL中的GROUP BY clauses and aggregate functions并掌握它们。您通常不需要在代码中执行此操作。

奖励:让所有用户被禁止3次或更多次

SELECT
  user_name,
  COUNT(*) as numbans
FROM bans
GROUP BY user_name
/* HAVING clause limits results of an aggregate like COUNT()  (which you cannot do in the WHERE clause) */
HAVING numbans >= 3

答案 1 :(得分:2)

获得前10名被禁止的人(如果您希望按顺序查看所有内容,请离开limit行):

select user_name, count(user_name) as num_of_bans
from bans
group by user_name
order by num_of_bans desc
limit 10

答案 2 :(得分:1)

SELECT user_name,COUNT(id) 来自table_name GROUP BY user_name