mysql - MySQL查询与两个不同表的计数之间的减法
问题描述
我有 4 个 MySQL 表:
设计师:id
,name
游戏:id
,,,name
_designer_id
开始: id
,game_id
完成:id
,game_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
解决方案
首先,我建议改变你的数据库设计并将开始表和完成表转换为一个,状态字段定义游戏是否完成(它只是一个建议你可以忽略它)
这可能会帮助您:
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
推荐阅读
- html - 使用 CSS 更改 .png 颜色
- mysql - mysql中的JSONB可用数据类型?
- git - 为所有项目生成源和更新文件夹
- c# - ASP.NET - 页面重新加载后 GridView 为空
- rest - Hbase REST 跳过授权
- node.js - node.js http 连接适用于 AWS 实例,不适用于 LoadBalancer
- javascript - Vue如何在提交表单时触发子组件
- python - 在python中合并两个字典视图
- ocr - 使用 OpenALPR PrepCharsForTraining 实用程序的字母缺失部分
- python - 在python中的数据框列表中访问数据框的列