SQL 如何统计每个用户接受Oxygen治疗的次数?
问题根因
- 原SQL存在4个问题,直接导致结果失真/报错:
- FROM子句多余关联无匹配条件的
Treatment t表:没有给t和其他表设置关联逻辑,会触发笛卡尔积,把匹配的关联表行数凭空放大,最终统计值错误。 - 子查询字段名写错:使用的
Treatment.Nombre在给定表结构中不存在,实际对应字段为Name,会直接触发语法报错。 - 治疗名称拼写不匹配:要筛选的治疗名为
Oxygen,原SQL写的匹配值是'Oxigen',会导致子查询返回空,匹配逻辑失效。 - GROUP BY字段不全:如果数据库开启严格校验模式,仅按
v.ID_Victim分组会报错,需要把SELECT里的非聚合字段v.Name也加入分组条件。
- FROM子句多余关联无匹配条件的
修正方案
精简写法(无冗余关联)
SELECT v.Name, COUNT(tv.ID_Treatment_Victim) AS Times FROM Victim v INNER JOIN Treatment_Victim tv ON v.ID_Victim = tv.ID_Victim WHERE tv.ID_Treatment = ( SELECT ID_Treatment FROM Treatment WHERE Name = 'Oxygen' ) GROUP BY v.ID_Victim, v.Name ORDER BY Times DESC LIMIT 5;
通用关联写法(可读性更强)
SELECT v.Name, COUNT(tv.ID_Treatment_Victim) AS Times FROM Victim v INNER JOIN Treatment_Victim tv ON v.ID_Victim = tv.ID_Victim INNER JOIN Treatment t ON tv.ID_Treatment = t.ID_Treatment WHERE t.Name = 'Oxygen' GROUP BY v.ID_Victim, v.Name ORDER BY Times DESC LIMIT 5;
示例数据验证结果
按照给出的测试数据,执行后输出:
| Name | Times |
|---|---|
| John | 2 |
| Alex | 1 |
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

