mysql 如何在总和上添加默认值以使总和行数相等

0yg35tkg  于 2022-11-28  发布在  Mysql
关注(0)|答案(1)|浏览(120)

我遇到了一个关于MySQL的问题。
我的数据库中有三个表:
表总成

____________
id | name | 
____________
1 | Le Mans|     
2 | Toulon |    
3 | Rennes |

桌上型游戏机

____________
id | name | 
____________
1 | Thibaut|     
2 | Fred |    
3 | Samir |

表格记录

_____________________________
id | gp_id | player_id | time  
_____________________________
1 | 1 | 1 | 22    
2 | 2 | 1 | 33
3 | 3 | 1 | 44
4 | 3 | 2 | 40
5 | 2 | 2 | 35  
6 | 1 | 2 | 20
7 | 1 | 3 | 25
8 | 3 | 3 | 38

我想获得在某些特定GP上至少有一个记录的玩家的时间总和,并为他们没有时间的GP设置默认时间
我不知道我怎么才能得到它。实际上我的SQL查询得到的值,但我不知道如何设置GP的默认时间没有完成的一些球员。

SELECT p.name, sum(time) as total_time
from records r 
join gp g on r.gp_id = g.id 
join player p on r.player_id = p.id
where gp.id in ( 1, 2, 3)
having count(distinct g.id) > 0
group by r.player_id

例如,对于此查询,我将获得以下值:

name | total_time
_________________
Thibaut | 99    
Fred | 95
Samir | 63

但我希望默认时间为99,如果在一个GP中没有时间给一个球员,所以在我的情况下,Samir应该有63+99 =〉162。但我不知道如何做到这一点,我不知道这是否可能
提前感谢各位!

y53ybaqx

y53ybaqx1#

如果没有匹配项,则使用LEFT JOIN获取空值,使用IFNULL()提供默认值来代替NULL。
使用CROSS JOINgp来指定应该考虑的所有博弈。

SELECT p.name, sum(IFNULL(time, 99)) as total_time
from player p 
cross join gp
left join records r on r.player_id = p.id AND r.gp_id = gp.id
WHERE gp.id IN (1, 2, 3)
group by p.id
having count(distinct r.gp_id) > 0

DEMO

相关问题