当前位置: 首页 > 知识库问答 >
问题:

如何查询架构中没有成员的团队

陈扬
2023-03-14

在我的数据库模式中,我有俱乐部、球队和球员,我想创建一个报告,统计俱乐部中的球队总数,以及没有球员的球队数量。输出如下:

CLUB      #TEAMS  #EMPTYTEAMS
Cobras    5       0
Eagles    7       2

我的架构在以下伪代码中进行了描述:

TABLE CLUB
  ID int
  NAME string

TABLE TEAM
  ID int
  NAME string

TABLE PLAYER
  ID int
  NAME string

TABLE CLUB_TEAM
  ID int
  CLUB_ID int   -- foreign key into CLUB
  TEAM_ID int   -- foreign key into TEAM

TABLE MEMBERSHIP
  ID int
  PLAYER_ID int -- foreign key into PLAYER
  TEAM_ID int   -- foreign key into TEAM

一些示例数据:

CLUB
0  Eagles
1  Cobras

TEAM
0  Eagles U10
1  Eagles U11
2  Eagles U12
...
7  Cobras U11
8  Cobras U12
9  Cobras U13
...

PLAYER
0 John Doe
1 Jane Doe
...

CLUB_TEAM
0 0 0  - The Eagles Club has an U10 team
1 0 1
2 0 2
...
7 1 7
8 1 8
9 1 9

MEMBERSHIP
0 0 7  - John plays for Cobras U11
1 1 9  - His older sister, Jane, plays for Cobras U13

我已经成功开发了一个查询,它将给出每个俱乐部的球队数量:

  SELECT CLUB.ID, CLUB.NAME, COUNT(CLUB_TEAM.ID) AS "#TEAMS"
  FROM CLUB
  INNER JOIN CLUB_TEAM
    ON CLUB_TEAM.CLUB_ID = CLUB.ID
  INNER JOIN TEAM
    ON CLUB_TEAM.TEAM_ID = TEAM.ID
  GROUP BY CLUB.ID

然而,我还不能将这个查询扩展到包括球队成员数据和没有球员的球队。有什么建议吗?

共有2个答案

厉钊
2023-03-14

也许这会有所帮助。由于没有示例数据,我无法对其进行测试,因此很可能存在语法错误(或两个!),但希望您能理解这个想法。基本上,您将成员资格表汇总为有一行给出每个团队的成员计数,然后将其留给原始查询。当团队没有成员时,COALESCE 处理这种情况,因此在左连接上返回一个 NULL 值,该值被转换为零。我相信PostgreSQL支持常见的表表达式(即我在这里使用的WITH子句),这在当今的SQL数据库中是非常标准的。

WITH team_membership AS (
     SELECT team_id, COUNT(*) AS membercount 
       FROM membership
)
SELECT club.id,
       club.name,
       COUNT(club_team.id) AS "#TEAMS",
       SUM(CASE WHEN COALESCE(membercount, 0) = 0 THEN 1 ELSE 0 END) AS "#EMPTYTEAMS"   
FROM   club
       INNER JOIN club_team
               ON club_team.club_id = club.id
       INNER JOIN team
               ON club_team.team_id = team.id
       LEFT JOIN team_membership
              ON club_team.team_id = team_membership.team_id
GROUP  BY club.id,
          club.name 
宇文鸣
2023-03-14

我设法找到了如何追踪空团队,我的解决方案类似于@user9601310的第二部分。

SELECT CLUB.ID, CLUB.NAME, COUNT(MEMBERSHIP.TEAM_ID) AS "#MEMBERS"
FROM CLUB
INNER JOIN CLUB_TEAM
  ON CLUB_TEAM.CLUB_ID = CLUB.ID
INNER JOIN TEAM
  ON CLUB_TEAM.TEAM_ID = TEAM.ID
LEFT JOIN MEMBERSHIP -- LEFT JOIN to capture teams with no members
  ON MEMBERSHIP.TEAM_ID = TEAM.ID
GROUP BY CLUB.ID, TEAM.ID
HAVING COUNT(MEMBERSHIP.TEAM_ID) = 0

从那里,我用以下方式包装了这个查询(…):

SELECT CLUB.ID, COUNT(#MEMBERS) AS "#EMPTYTEAMS"
FROM ( ... ) AS "QUERY"
GROUP BY CLUB.ID

这给了我每个俱乐部的空队数量。

然后,基于这个问题中的想法,我以如下方式组合了我的两个查询——上面的一个和问题中的一个:

SELECT SET1.ID, CLUB.NAME, "#TEAMS", "#EMPTYTEAMS"
FROM ( query 1 ) SET1
INNER JOIN ( query 2 ) SET2
ON SET1.ID = SET2.ID

这给了我想要的结果。不太优雅,但是内心的疑问相当直截了当,它们的组合也是如此。

 类似资料:
  • 问题内容: 在寻找Java库以数据库不可知的方式构建查询时,我遇到了许多信息,包括iciql,querydsl,jooq,joist,hibernate等。 我想要一些不需要配置文件并且可以使用动态架构的东西。对于我的应用程序,我在运行时了解数据库和架构,因此我没有架构的任何配置文件或域类。 这似乎是querydsl的核心目标之一,但仔细阅读querydsl的文档,我看到了很多使用域类构建动态查询

  • PM给我们提了个需求,是快速做一个查询工具(web app) 预设几种查询的数据集(配好join之类的关联) 然后可以在前端页面上直接设置查询条件,导出结果表单 要求就是不花很多功夫(因为只是一个小工具),配好数据集之后就能用 可以自定义查询条件和输出的字段 因为数据量比较大,不能直接查出结果之后写filter过滤 想问下有没有这种简单好用的框架

  • 操作步骤: ①登录账号进入工作台 ②选择团队设置查看团队成员。 提示: ●团队管理员可以进行新建地图、删除地图、创建地图副本等操作。 ●在团队设置中可以查找成员、邀请成员以及更换成员权限和移除成员。 ●团队至少要有一个管理员。 操作动图: [查看原图]

  • 问题内容: 根据MSDN,返回已执行查询的列元数据。我想知道是否有类似的方法将为给定查询提供表元数据?我的意思是涉及哪些表以及它具有什么别名。 在我的应用程序中,我得到了查询,并且需要以编程方式附加该子句。使用,我可以获取列元数据及其所属的表。但是,即使表具有别名,它仍然会返回真实的表名。有没有办法获取该表的别名? 以下代码显示如何获取列元数据。 这将为我正确提供列的详细信息。但是当我看到列时,它

  • 这是我命令的代码部分!虽然只有这一部分我不能很好地理解!我正试图让机器人在队列结束后离开! 它说和工作只是让机器人离开语音通道是我无法解决的问题!我尝试了以下方法: 编辑:

  • 问题内容: 我正在一个Swift操场上玩,正在上一堂新课。由于某种原因,我不断收到这样的错误:类“没有成员类型”,其名称的常量前面定义了三行。这是代码: Xcode Beta6一直在倒数第二行给我一个错误,说“ DataModel.Type没有名为’myCalendar’的成员 尽管我认为这不会有所作为,但我尝试将myCalendar定义为var。 问题答案: 您无法初始化引用同一类的另一个实例属