在继续之前,我不想使用任何涉及选择所有行并手动计算出现次数的查询。顺便说一句,我在 PHP 中这样做。
基本上,我有一张禁令表。每个新记录/行都是一个新禁令。标题字段user_name
表示被禁止的玩家。有没有办法计算这张表中谁的禁令最多?我真的不想选择每一行然后为每个玩家计算它。该表非常大,因此使上述解决方案不切实际且效率低下。
这是通过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
子句和聚合函数并掌握它们。您通常不需要在代码中执行此操作。
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
获得最禁止的前 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
table_name
从GROUP BY 中选择用户名、计数(id) user_name