3

先に進む前に、すべての行を選択して出現回数を手動でカウントする ANY クエリを使用したくありません。ちなみに私はこれを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 システムは、データの整理とクエリのために明示的に設計されており、このようなタスクを効率的に実行するのに非常に優れています。GROUP BYMySQL の句と集約関数を読み、それらをマスターします。通常、コードで行う必要はありません。

ボーナス: すべてのユーザーを 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

SELECT user_name , COUNT( id ) FROM table_name GROUP BY user_name

于 2012-04-28T13:21:58.313 に答える