3

ある種のオンラインゲームを実現しました。ここで、最も多く対戦した敵が誰であるかを確認できる統計を表示したいと思います。

ゲームをデータベースに保存しました。プレーヤーは、フィールド PLAYER1 および PLAYER2 に格納されます。どちらが他の人を招待するかによって異なります。ゲームを開始し、相手を招待するのは PLAYER1 です。

ID | PLAYER1 | PLAYER2 | GAMESTATE

今、私は特定のエントリを持っています。私がプレーヤー 1 で、友人 (2) が私を 2 回招待したとしましょう。エントリは次のようになります。

1  | 2       | 1       | 1
2  | 2       | 1       | 1
3  | 1       | 2       | 1
4  | 3       | 4       | 1  <-- some other random game

今、一番一緒にプレーした選手を知りたいです。実際には、最もプレイされたプレーヤーをカウントする 1 つの選択が必要ですが、どちらの場合も (PLAYER1 または PLAYER2)。

1 つのクエリに最適なソリューションは何でしょうか? MySQL UNIONまたは GROUP BYを使用できますか? はいの場合、どうすればよいですか?

編集: 期待される結果は実際には次のようになります:

PLAYER | MOST_ENEMY | GAMES
1      | 2          | 3
2      | 1          | 3
3      | 4          | 1
4      | 3          | 1

ご協力ありがとうございました!

4

3 に答える 3

2

それはあなたが望むものですか?

SELECT * FROM (
    SELECT 
      PLAYER1,
      PLAYER2,
      COUNT(*) CNT
    FROM
      (
        SELECT PLAYER1, PLAYER2 FROM matches 
        UNION ALL
        SELECT PLAYER2 PLAYER1, PLAYER1 PLAYER2 FROM matches
      ) sub
    GROUP BY
      sub.PLAYER1,
      sub.PLAYER2
    ) sub2
GROUP BY
  sub2.PLAYER1
HAVING
  sub2.CNT = MAX(sub2.CNT)
于 2012-08-31T10:17:22.533 に答える
0
select (case when player1< player2 then player1 else player2 end) first_player, 
(case when player1 > player2 then player1 else player2 end) second_player, 
count(*) games
 from game
where (player1 = 1 or player2 = 1) 
group by first_player, second_player
order by games desc
limit 1
于 2012-08-31T10:17:35.647 に答える
0

あなたがいる場所 プレイヤー 1...

select 
    case player1 when 1 then player2 else player1 end as player, 
    count(*) as games
from yourtable
where 1 in (player1, player2)
group by case player1 when 1 then player2 else player1 end 
order by count(*) desc
limit 1

一般的なケースを見つけるには、より複雑です-グループごとの最大値などに興味があります

create temporary table games (id int, player int)
insert games (id,player)
    select ID, PLAYER1 as player
    from yourtable
    union
    select ID, PLAYER2
    from yourtable

create temporary table gamecount (player1 int, player2 int, gamecount int)
insert gamecount (player1,player2,gamecount)
    select c1.player, c2.player as player2, COUNT(*) as gamecount
        from games c1
        inner join games c2
           on c1.ID = c2.id
           and c1.player<>c2.player

    group by c1.player, c2.player

select * from gamecount topscore
where not exists
(select * from gamecount high 
where high.player1 = topscore.player1 
and high.gamecount>topscore.gamecount)
order by player1, gamecount desc


drop temporary table gamecount
drop temporary table games  
于 2012-08-31T10:10:24.987 に答える