选择具有固定奖杯数和分数的玩家

时间:2018-02-22 09:31:01

标签: mysql sql linq select

我需要打印出有2个奖杯的玩家,我需要总结他们所有的比赛积分。我需要使用我的数据库enter image description here

中的3个表格

1.我需要trophy_count,我可以通过这一步 - >

select surname, count(t.player_id) as trophy_count

from dbo.Players p 
left join Trophies t  on t.player_id=p.id

group by p.surname

所以,SQL给了我这个

enter image description here

2.打印所有获得的积分 - >

select name, sum(points) as points


from dbo.Players p
    inner join dbo.Stats s on s.player_id=p.id  

    group by p.name

SQL给了我这个:

enter image description here

我想在一个查询中执行此操作:

select name, sum(points) as points, COUNT(t.player_id) as trophy_count


from dbo.Players p
    inner join dbo.Stats s on s.player_id=p.id  
    inner join dbo.Trophies t on t.player_id=p.id

    group by p.name

并且SQL给了我这个,SQL将x 2所有信息相乘,这是错误的

enter image description here

而且,在这次失败的时候,我不知道我需要写什么,对于那些有2个奖杯并总结他们的积分的精选球员。 (Lonzo球21分2trophies,Kristaps Porzingis 17分2trophies)。

3 个答案:

答案 0 :(得分:1)

为了获得更安全的结果,请将所有当前查询包装在子查询中。

SELECT p.id, p.name, p.surname, 
        IFNULL(trop.trophy_count, 0),
        IFNULL(pts.points, 0)
FROM dbo.Players p
    LEFT JOIN 
    (
        select p.id, count(t.player_id) as trophy_count
        from dbo.Players p 
                left join Trophies t  on t.player_id=p.id
        group by p.id
    ) trop ON p.id = trop.id
    LEFT JOIN
    (
        select p.id,sum(points) as points
        from dbo.Players p
            inner join dbo.Stats s on s.player_id = p.id    
        group by p.id
    ) pts ON p.id = pts.id

答案 1 :(得分:0)

你能检查一下:

SELECT P.name,
 (SELECT CASE WHEN (SUM(S.points) IS NULL) THEN 0 ELSE SUM(S.points) END FROM Stats S WHERE S.player_id = P.id ) as points,
 (SELECT COUNT(T.player_id) FROM Trophies T WHERE T.player_id = P.id ) as trophy_count 
FROM Players P

我在查询中的表格前没有指定dbo.,如果您需要,请添加&测试

SQL Fiddle

答案 2 :(得分:0)

它适用于你的问题

SELECT dbo.Players.name, dbo.Players.surname, ISNULL(s.points, 0) points, ISNULL(t.trophy_count, 0) trophies_count FROM dbo.Players
LEFT JOIN (
    SELECT player_id, SUM(points) points FROM dbo.Stats
    GROUP BY player_id
) s ON s.player_id = dbo.Players.id
LEFT JOIN (
    SELECT player_id, COUNT(*) trophy_count FROM dbo.Trophies
    GROUP BY player_id
) t ON t.player_id = dbo.Players.id
WHERE t.trophy_count = 2