我有一个包含 3 个表的数据库:students
、courses
和 mistakes
。我有一个连接表 (csm
),我在其中连接 3 个表。我假设每门类(class)的错误都是一样的。
表格类(class)
+----------+---------------+
| crs_id | crs_name |
+----------+---------------+
| 1 | HTML |
| 2 | PHP |
| 3 | Python |
+----------+---------------+
表生
+----------+---------------+---------------+
| stu_id | stu_firstname | stu_lastname |
+----------+---------------+---------------+
| 1 | Tina | Turner |
| 2 | Lisa | Laroi |
| 3 | Dina | Donna |
| 3 | Jim | Leduc |
+----------+---------------+---------------+
表格错误
+----------+---------------+------------+
| mis_id | mis_name | mis_weight |
+----------+---------------+------------+
| 1 | No camelCase | 7 |
| 2 | No brackets | 10 |
| 3 | Operator mist.| 12 |
+----------+---------------+------------+
连接表CSM
+----------+------------+------------+------------+
| csm_id | fk_crs_id | fk_stu_id | fk_mis_id |
+----------+------------+------------+------------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 3 |
| 3 | 2 | 3 | 1 |
| 4 | 3 | 2 | 2 |
| 5 | 3 | 2 | 1 |
| 6 | 3 | 3 | 1 |
+----------+------------+------------+------------+
如果我选择了一门特定的类(class),我想得到一份所有学生的名单,其中有这门类(class)的减分。所以我也想在joining table csm中得到没有结果的同学。
我得到的最接近结果是使用以下 sql 语句:
select stu_firsname, stu_lastname, csm.*, sum(mis_weight)
from students s
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id
left join mistakes m on csm.fk_mis_id = m.mis_id
where fk_crs_id = 4 or fk_crs_id is null
group by stu_firstname;
有了这个,我得到了某门类(class)的错误总和,以及在 CSM 表中没有任何记录的学生,但缺少一些结果。例如,这不会显示在 CSM 表中有记录的学生,但不会显示所请求类(class)的学生。
我如何在我的成绩表中找到这些学生?
最佳答案
在您的查询中:
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id`
...
where fk_crs_id = 4 or fk_crs_id is null
这不是您想要的,因为此条件将过滤掉在 csm
表中仅针对 4
以外的类(class)有记录的学生。您想要将该条件移动到相应的 LEFT JOIN
:
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id AND csm.fk_crs_id = 4
另一个潜在的问题来源是查询处理聚合的方式。 SELECT
子句中的非聚合列未出现在 GROUP BY
子句中。这种语法不是好的 SQL 编码习惯,从 MySQL 5.7 版本开始不再支持。我假设您想在每个学生的成绩中记录一条记录。
查询:
select
s.stu_firstname,
s.stu_lastname,
sum(m.mis_weight) total_misses_weight
from
students s
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id AND csm.fk_crs_id = 3
left join mistakes m on csm.fk_mis_id = m.mis_id
group by
s.stu_id,
s.stu_firstname,
s.stu_lastname
Demo on DB Fiddle 对于类(class) ID 3
:
| stu_firstname | stu_lastname | total_misses_weight |
| ------------- | ------------ | ------------------- |
| Tina | Turner | |
| Lisa | Laroi | 17 |
| Dina | Donna | 7 |
| Jim | Leduc | |
关于mysql - 加入后如何获取一张表的所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54874615/