mysql - 加入后如何获取一张表的所有行?

标签 mysql sql

我有一个包含 3 个表的数据库:studentscoursesmistakes。我有一个连接表 (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/

相关文章:

mysql - 来自 mysql 查询的重复结果

带有操作按钮的 php 分页

mysql - 使用if else自动更新mysql表中的记录

sql - 查找其他oracle表中不存在的记录

php - 更新 SQL 表的行

c# - 将日期与字符串 Entity Framework 进行比较

sql - to_json 不能在 spark 中使用 selectExpr

php - 删除数据后重新整理数据库中的id字段

Mysql - 从 'Show master status' 查询中选择值

sql - SQL Server 2005 有趣且具有挑战性的自连接问题