0

このようなMySQLテーブルがあります

users
user_id | partner_id | name
--------+------------+-----
1       | 2          | aaa
2       | 1          | bbb
3       | 4          | ccc
4       | 3          | ddd

games
game_id | user_id
--------+--------
1       | 1
2       | 1
3       | 2
4       | 3
5       | 4
6       | 4

scores
game_id | level | score | time
--------+-------+-------+-----
1       | 1     | 1     | 10
1       | 2     | 1     | 10
1       | 3     | 1     | 10
2       | 1     | 0     | 20
2       | 2     | 0     | 20
2       | 3     | 0     | 20
3       | 1     | 1     | 30
3       | 2     | 1     | 30
3       | 3     | 1     | 30
4       | 1     | 1     | 2
4       | 2     | 1     | 2
4       | 3     | 1     | 2
5       | 1     | 1     | 5
5       | 2     | 1     | 5
5       | 3     | 1     | 5
6       | 1     | 1     | 3
6       | 2     | 1     | 3
6       | 3     | 0     | 3

そして、ゲームごとにポイントと時間を合計するようにクエリする必要があるため、次のようになります

game_id | user_id | sumPoints | sumTime
--------+---------+-----------+--------
1       | 1       | 3         | 30
2       | 1       | 0         | 60
3       | 2       | 3         | 90
4       | 3       | 3         | 6
5       | 4       | 3         | 15
6       | 4       | 2         | 9

そして、ペアごとに最高のスコアを取得する必要があるため (1 人のユーザーのスコアが高くなる場合)、次のようになります。

user1_id | user2_id | sumPoints | sumTime
---------+----------+-----------+--------
3        | 4        | 3         | 6
1        | 2        | 3         | 30

それが最終結果です。誰かがSQLクエリとしてどのように見えるかを教えていただければ幸いです。この投稿で、最初の部分は JW 웃</a>によって解決されたことに言及したいと思います

前もって感謝します。

4

2 に答える 2

0

このようなものが機能するはずです(これは2番目のクエリに答えます)

SELECT 
  user_details.user_id,
  user_details.partner_id,
  score_details.score,
  score_details.time
FROM 
    ( SELECT 
        min(user_id) as user_id, 
        max(user_id) as partner_id
      FROM 
        users 
      GROUP BY
        user_id + partner_id ) AS user_details
    JOIN 
    ( SELECT 
        scores.game_id ,
        games.user_id,
        sum(score) score, 
        sum(time) time,
        @row_num := IF(@prev_value=games.user_id,@row_num+1,1) AS row_num,
        @prev_value := games.user_id
      FROM  
        scores 
        inner join games on games.game_id = scores.game_id
        inner join users on users.user_id = games.user_id
      GROUP BY
        scores.game_id
      ORDER BY
        user_id, 
        score
    ) as score_details ON ( score_details.user_id = user_details.user_id AND score_details.row_num = 1)

の最初の部分はと一緒にJOIN取得され、ペア内で最初に表示されたユーザーが最初に表示されます。たとえば、ID を持つユーザーが 2 人いる場合、ペア内で最初に表示された 1を考慮します。userspartners1 and 2user_iduser

2 番目のクエリは、"echo_me" の回答と、for eachのrow_numberを指定するに基づいています。最高のランクは、すべてのユーザーに対して 1 です。rankingscoresuserscore

SQLFIDDLE

これが役立つことを願っています

于 2013-05-03T14:37:34.553 に答える