mysql - 检查表 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。
我对此感到非常困惑,非常感谢任何帮助。
解决方案
推荐阅读
- php - Symfony Forms - 获取多个未映射的集合以合并并提交到单个实体
- javascript - 如何根据用户来自的 URL 将用户重定向到另一个 URL
- python - Style.map(background = ['state', 'any_color']) 如何影响 ttk.Button?
- http - 将值接收器用于包含 http.Client 的结构上的方法会影响连接池吗?
- opengl - 如何将自定义结构从顶点着色器传递到片段着色器
- javascript - 无法将对象从另一个 .js 文件传递到链接的 .js 文件...使用 Socket.io
- css - 什么被认为是 Spring MVC 项目的根目录,以及如何访问其子目录?
- c++ - 打印机打印太大
- javascript - 加载带有加载指示器的页面 - 反应
- php - 未找到 000webhost 404 上的 CodeIgniter 3