2

私はSQLに不慣れで、それを学ぼうとしています。私に起こった問題は、テーブル内の人の特定の発生の最大数を見つける方法でした。クエリが各IDを別のIDと比較し、カウントを追跡する方法がわかりません。説明は不十分ですが、これがデータセットであり、より明確になることを願っています。

players:
+--------+--------+
| pid    | name   |
+--------+--------+
| 1      | Tom    |
| 2      | Sam    |
| 3      | Dan    |
+--------+--------+

scores:
+--------+--------+--------+
| sid    | pid    | result |
+--------+--------+--------+
| 1      | 1      | miss   |
| 2      | 1      | hit    |
| 3      | 3      | hit    |
| 4      | 2      | miss   |
| 5      | 3      | hit    |
| 6      | 3      | hit    |
+--------+--------+--------+

予想される答えは、pid = 3、name = Danです。これは、他のすべてのプレーヤーの中で最もヒット数が多かったためです。

4

3 に答える 3

2
Select
  p.pid,
  p.name
From (
  Select
    p.pid,
    p.name,
    count(*)
  From
    players p
      inner join
    scores s On
      p.pid = s.pid
  Where
    result = 'hit'
  Group By
    p.pid,
    p.name
  Order By
    count(*) Desc
  ) p
Where 
  rownum = 1;

http://sqlfiddle.com/#!4/03ba0/22

于 2012-11-18T23:03:42.980 に答える
1

これを試してください: SQLFiddleデモ

select  pid, hits from(
    Select p.pid, count(*) as hits FROM players p
    JOIN scores s
         ON p.pid = s.pid AND s.result = 'hit'
    GROUP BY p.pid
    ORDER By count(*) DESC
)
Where rownum <= 1
于 2012-11-18T23:05:08.393 に答える
0

これも解決策になる可能性があります。

select
  players.pid,
  players.name
from
  scores inner join players
  on scores.pid = players.pid
  and scores.result = 'hit'
group by players.pid, players.name
having count(*)=(select max(cnt)
                 from
                   (select pid, count(*) as cnt
                    from scores
                    where result='hit'
                    group by pid) t)

すべてのヒット数が同じである場合、これにより複数のプレーヤーが返されることに注意してください。また、プレーヤーがスコアテーブルに存在するが、プレーヤーテーブルには存在しない場合、表示されないことにも注意してください。

于 2012-11-18T23:41:21.070 に答える