【问题标题】:SQLQuery COUNT number of games per teamSQLQuery COUNT 场比赛数
【发布时间】:2015-02-12 21:56:54
【问题描述】:

我有 4 张桌子:

团队

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

所以基本上我想:

获取桌面游戏并展示:

团队名称 |培训师姓名 |目标主页 |目标反对 |积分 |主队的比赛数量

我在 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)

Count 上的每个应该是 2 个

有什么想法吗?

【问题讨论】:

  • 什么是数据库:SQL Server、PostgreSQL、MySQL?
  • SQL Server 管理工作室

标签: sql select count


【解决方案1】:

你得到错误结果的原因是错误的连接数据类型。您应该使用 repsectivelly: 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

【讨论】:

  • 不太明白怎么用
  • 哪一部分?你要数什么?
  • 一个团队的总游戏数。 (在这种情况下,他们都玩了两次,所以计数应该是 2,而不是 1)
  • 好的,我会尝试为您创建 SQL Fiddle... 等等。
  • 添加了没有其余部分的选择计数并工作了,因为我不太了解其余部分,因为我一生中从未见过它。很抱歉让你在这方面浪费了一些时间,但它最终帮助了我。非常感谢。
【解决方案2】:

您可以通过说来更改 WHERE 子句

[what you have] OR (Games.codTeamAgainst = Teams.codTeam AND ...)

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

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

【讨论】:

  • 这只会向更多游戏发送垃圾邮件,并没有改变计数。 ://
  • @Ran:你明白 GROUP BY 条件的作用吗?见stackoverflow.com/questions/2421388/…。正如我在回答中指出的那样,您可能正在创建太多组。您只是将比分完全相同的比赛汇总在一起,因此您没有将主队以 3-2 获胜的比赛与主队以 1-2 输球的比赛分组。这就是为什么您以 3-2 的比分获得 1 场比赛的计数。
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 2015-09-16
  • 2022-11-23
  • 2012-03-27
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多