首页 > 解决方案 > 检查表 A 中的所有行在表 B 中是否具有特定值,包括 GROUP BY

问题描述

我有两张表——学生证据——我正在尝试检查证据中的一列中的相应值,并根据学生中的每个条目按证据中的另一列分组

这些是表格的样子:

> desc students;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| firstname  | varchar(191)        | NO   |     | NULL    |                |
| surname    | varchar(191)        | NO   |     | NULL    |                |
| class_id   | int(11)             | NO   |     | NULL    |                |
| dob        | datetime            | NO   |     | NULL    |                |
| enrollment | datetime            | NO   |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+

> desc evidence;
+---------------+------------------------------------------------+------+-----+---------+----------------+
| Field         | Type                                           | Null | Key | Default | Extra          |
+---------------+------------------------------------------------+------+-----+---------+----------------+
| id            | bigint(20) unsigned                            | NO   | PRI | NULL    | auto_increment |
| type          | enum('written','image','audio','video','link') | YES  |     | NULL    |                |
| mime          | varchar(191)                                   | YES  |     | NULL    |                |
| path          | varchar(191)                                   | YES  |     | NULL    |                |
| user_id       | int(11)                                        | NO   |     | NULL    |                |
| date_recorded | datetime                                       | YES  |     | NULL    |                |
| statement_id  | int(11)                                        | NO   |     | NULL    |                |
| progress      | int(11)                                        | NO   |     | NULL    |                |
| notes         | mediumtext                                     | YES  |     | NULL    |                |
| student       | int(11)                                        | NO   | MUL | NULL    |                |
| created_at    | timestamp                                      | YES  |     | NULL    |                |
| updated_at    | timestamp                                      | YES  |     | NULL    |                |
+---------------+------------------------------------------------+------+-----+---------+----------------+

证据表中的条目与学生 (evidence.student_id) 和证据陈述 (evidence.statement_id) 相关联,然后赋予进度值 1(进行中)或 2(完成)。

我希望能够检查每个statement_id的每个学生至少有一行进度条目设置为 2。理想情况下,我想 GROUP BY statement_id 并且如果每个学生至少返回值 2 来表示进度该statement_id的证据表中的一行,其中进度已设置为 2。

目标是列出班级中每个人都已完成任务的所有statement_id(因此添加了一些证据并设置完成进度)。

我试过做与此类似的连接

SELECT * FROM students left join evidence ON students.id = evidence.student GROUP BY evidence.statement_id HAVING progress = 2;

但问题在于,如果一个学生被标记为完成了一个statement_id但另一个学生没有该statement_id的任何条目,那么进度将返回 2。我宁愿它只为没有任何条目的学生返回 NULL。

我对此感到非常困惑,非常感谢任何帮助。

标签: mysql

解决方案


推荐阅读