首页 > 解决方案 > MySQL查询与两个不同表的计数之间的减法

问题描述

我有 4 个 MySQL 表:

设计师idname

游戏id,,,name_designer_id

开始: id,game_id

完成idgame_id

started我的应用程序在游戏开始时添加了一行。finished它在游戏结束时添加一行。我想获得按设计师姓名分组的已开始但未完成游戏的总数。这是我到目前为止所拥有的:

SELECT designer.name, COUNT(started.game_id) AS total FROM started 
  LEFT JOIN game ON started.game_id = game.id 
  LEFT JOIN designer ON game.designer_id = designer.id 
  GROUP BY designer.name  

这让我得到了按设计师分组的已开始游戏的总数。但它没有考虑到我只想要开始而不是完成游戏的事实。

我尝试减去总数,如下所示:

SELECT designer.name, (COUNT(started.game_id) - COUNT(finished.game_id)) AS total 
  FROM started 
  LEFT JOIN game ON started.game_id = game.id 
  LEFT JOIN designer ON game.designer_id = designer.id 
  LEFT JOIN finished ON finished.game_id = started.game_id
  GROUP BY designer.name 

但这会返回总数0,尽管开始的游戏多于完成的游戏。

示例数据:

设计师

id | name
--------------
1  | Jim Smith

游戏

id | name | designer_id
-----------------------
1  | Test | 1

开始

id | game_id
------------
1  | 1
2  | 1
3  | 1
4  | 1

完成的

id | game_id
------------
1  | 1
2  | 1

标签: mysql

解决方案


首先,我建议改变你的数据库设计并将开始表和完成表转换为一个,状态字段定义游戏是否完成(它只是一个建议你可以忽略它)

这可能会帮助您:

Select name as dname , count(*) from designer where id in 
(Select designer_id from game where id in 
(Select started.id from started where started.gameid not in 
(Select finished.gameid from finished))) 
group by dname 

推荐阅读