SQLQuery COUNT 每支球队的比赛数

SQLQuery COUNT number of games per team

我有 4 个 table:

团队

codTeam: 1
year: 1995
codYears: 1
codType: 1
name: FCP
points: 3

codTeam: 2
year: 1990
codYears: 1
codType: 1
name: SLB
points: 3

codTeam: 3
year: 1995
codYears: 3
codType: 2
name: BCP
points: 0

培训师(培训团队的人)

codTrainer: 1
name: Peter
street: Ghost street
cellphone: 252666337
birthdayDate: 1995-02-01
BI: 11111111
number: 121212121

codTrainer: 1
name: Pan
street: Ghost street Remade
cellphone: 253999666
birthdayDate: 1995-01-01
BI: 22222222
number: 212121212

TeamsTrainers(有人在哪个队训练)

codTeamTrainer: 1
codTeam: 1
codTrainer: 2
dataInicio: 1998-05-05

codTeamTrainer: 2
codTeam: 2
codTrainer: 2
dataInicio: 1998-06-07

codTeamTrainer: 3
codTeam: 2
codTrainer: 1
dataInicio: 1999-09-09

游戏

codGame: 1
date: 2015-02-12 13:00:00
codTeamHome: 1
codTeamAgainst: 2
goalsHome: 3
goalsAgainst: 2
codTypeGame: 1

codGame: 2
date: 2015-02-12 15:00:00
codTeamHome: 2
codTeamAgainst: 1
goalsHome: 1
goalsAgainst: 2
codTypeGame: 3

所以基本上我想:

获取table游戏并展示:

队名 |教练姓名 |目标主页 |进球数 |积分 |主队比赛总人数

我在 SQLQuery 中有以下代码:

SELECT Teams.name, Trainers.name, Games.goalsHome,
       Games.goalsAgainst, Teams.points, COUNT(*)
FROM Teams, Trainers, Games, TeamsTrainers
WHERE Games.codTeamHome = Teams.codTeam AND 
      TeamsTrainers.codTeam = Teams.codTeam AND 
      TeamsTrainers.codTrainer = Trainers.codTrainer
GROUP BY Teams.name, Trainers.name, Games.goalsHome, 
         Games.goalsAgainst, Teams.points

(我翻译的可能有一些错误)

然而,COUNT 只显示 1(可能是因为在 WHERE 上它有 "teamHome" 所以它只计数 1),但是,如果是因为这个,我该如何解决它?

结果:

FCP | Pan | 3 | 2 | 3 | 1 (Count)
SLB | Peter | 1 | 2 | 3 | 1 (Count)
SLB | Pan | 1 | 2 | 3 | 1 (Count)

计数上每一个应该是2个

有什么想法吗?

您可以通过说

来更改 WHERE 子句
[what you have] OR (Games.codTeamAgainst = Teams.codTeam AND ...)

但是,这可能会导致其他问题,因为您可能关心特定球队是否进球,而不是主队是否在双方球队进行的比赛中进球。

您可能暂时不会注意到其他问题,因为您的 GROUP BY 子句可能与您想要的相去甚远,您可能希望选择聚合函数来实现更简单的分组。

你得到错误结果的原因是连接数据类型错误。您应该使用 repsectiively: left, right or inner join 而不是通过使用 where 子句来连接数据。您的数据模型提供 1 到 N 关系,因此您应该使用特定类型的联接。

参见:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

编辑

SELECT Te.name, Tr.name, Ga.goalsHome, Ga.goalsAgainst, Te.points,
       (SELECT COUNT(*)
        FROM Games 
        WHERE codTeamHome = Te.codTeam OR codTeamAgainst = Te.codTeam)
        AS CountOfGames
FROM TeamsTrainers AS Tt
    LEFT JOIN Teams AS Te ON Tt.codTeam = Te.codTeam
    LEFT JOIN Trainers AS Tr ON Tt.codTrainer = Tr.codTrainer
    LEFT JOIN Games AS Ga ON  Ga.codTeamHome = Te.codTeam

SQL Fiddle