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