繁体   English   中英

以最少的时间总和获得最大的配对用户分数

[英]Get max paired users scores with min time sums

我有看起来像这样的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

然后我需要获得每对最佳分数(其中一个用户的分数更高),所以它看起来像这样:

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

那是最终结果。 如果有人可以向我展示sql查询的样子,我将非常感激。 我想提一提,第一部分由解决JW 웃这个岗位

提前致谢。

尝试这个

 select scores.game_id ,games.user_id,sum(score) score, sum(time) time
 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

此处演示

获得最佳成绩

select users.user_id as user1_id,users.partner_id as user2_id,sum(score) score, sum(time) time
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 sum(time) asc limit 1

此处演示

输出。

 USER1_ID   USER2_ID    SCORE   TIME
   1            2         3      30

这样的事情应该起作用(这可以回答您的第二个查询)

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的第一部分将users及其partners吸引到一起,首先显示在其对中首先出现的用户,例如:如果有2个ID为1 and 2用户,我认为user 1的user_id首先出现在其对中。

第二个查询是基于与沿“echo_me”答案row_number指定ranking中的scores为每个user ,最高score对每个用户的等级为1。

SQLFIDDLE

希望这会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM