3

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

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

4

3 回答 3

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子句和聚合函数并掌握它们。您通常不需要在代码中执行此操作。

奖励:让所有用户被禁止 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
于 2012-04-28T13:19:42.730 回答
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
于 2012-04-28T13:19:46.173 回答
1

table_name 从GROUP BY 中选择用户名、计数(id) user_name

于 2012-04-28T13:21:58.313 回答