1

我想看看一个球员在他最喜欢的体育场输了多少次。我尝试了以下方法,但没有返回正确的值:

select players.name,
count (case when players.team <> matches.winner and favstadiums.stadium = matches.stadium then 1 else null end) as LOSSES
from players
join favstadiums
on favstadiums.player = players.name 
join matches
on favstadiums.stadium = matches.stadium
group by players.name;

我也尝试过左/右连接,但它对输出没有影响。

下面是数据库的关系图,供参考:

在此处输入图像描述

有任何想法吗?

4

4 回答 4

2

你的join情况没有球员在球场上比赛。您需要添加球员所在球队在最喜欢的体育场比赛的条件:

select players.name,
       SUM(case when players.team <> matches.winner then 1 else 0 end) as Losses
from players join
     favstadiums
     on favstadiums.player = players.name join
     matches
     on favstadiums.stadium = matches.stadium and
        players.team in (matches.home, matches.away)
group by players.name;
于 2013-05-08T19:29:46.837 回答
1

尝试以下操作:

SELECT  P.name,
        COUNT(DISTINCT M.ID) AS Losses
FROM Player P
INNER JOIN favStadiums FS
    ON P.name = FS.player
INNER JOIN Match M
    ON (P.team = M.home OR P.team = M.away)
WHERE FS.stadium = M.stadium
AND M.winner <> P.team
于 2013-05-08T19:30:22.803 回答
0

这应该可以,检查一下

select player.name,
count(match.id) as LOSSES
from player
inner join team
    on player.team = team.name 
left join match
    inner join favStadiums on favstadiums.stadium = matches.stadium and favStadiums.player = player.name
    on (match.home = team.name or match.away = team.name) and match.winner <> team.name     
group by players.name;
于 2013-05-08T19:29:14.023 回答
0

只是另一个混​​合在一起......我缩进我的加入以显示我如何获得细节的关系。

SELECT
      P.`Name`,
      SUM( case when P.team <> M.winner then 1 else 0 end ) as FavStadiumLosses
   from
      Player P
         Join Match M
            ON P.Team = M.`Home`
            OR P.Team = M.Away
            Join Stadium S
               ON M.Stadium = S.Stadium
               JOIN FavStadiums FS
                  ON P.`Name` = FS.Player
                  AND M.Stadium = FS.Stadium
   group by
      P.`Name`
于 2013-05-08T19:34:43.483 回答