mysql - 在这种情况下如何做加入策略?

标签 mysql sql

这是我正在处理的情况:

我有 4 个表:

用户表:

+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  2 | name2 |
|  3 | name3 |
+----+-------+

分配表:

+----+-----------------+
| id | assignment_name |
+----+-----------------+
| 11 | name1           |
| 12 | name2           |
| 13 | name3           |
+----+-----------------+

提交:

+----+---------------+---------+
| id | assignment_id | user_id |
+----+---------------+---------+
|  1 |            11 |       3 |
|  2 |            12 |       1 |
|  3 |            11 |       2 |
+----+---------------+---------+

群组提交

+----+----------------+---------+
| id | submission_id | user_id  |
+----+----------------+---------+
|  1 |              1 |       1 |
|  2 |              1 |       2 |
|  3 |              3 |       1 |
+----+----------------+---------+

提交表有一个 assignment_id 来告诉提交属于哪个分配。

用户也可以提交群组提交,提交的人进入提交表,而其他人进入 group_submissions 表。这样一来,它将被计为一次提交,而不是基于组中有多少人的 2,3...N 次提交。

如何获取已提交提交或已参与给定作业中的组提交的用户?

结果应根据分配 ID 返回提交表或 group_submissions 表中的一个或多个用户

结果应该是这样的:

+----+-------+
| id | name  |
+----+-------+
|  1 | name1 |
|  2 | name2 |
+----+-------+

它基本上应该返回用户表。

这是我到目前为止尝试过的:

这只给我不在提交表中但在 group_submission 中的用户

select * from users u
right join group_submissions gs on u.id = gs.student_id
right join assignment_submissions ass on gs.submission_id = ass.id
inner join assignments a on a.id = ass.assignment_id
where a.id = number

这只会给我一个提交的用户(在提交表中)

select * from users u
right join assignment_submissions ass on u.id= ass.student_id
right join group_submissions gs on ass.id = gs.submission_id
inner join assignments a on a.id = ass.assignment_id
where a.id = number

我的加入策略应该是什么?或者在这里加入不是正确的选择。

注意:这是一个 MySQL 数据库。

最佳答案

你可以使用exists:

select u.*
from users u
where 
    exists (
        select 1 
        from submissions s 
        where s.user_id = u.id and s.assignment_id = ?
    )
    or exists (
        select 1 
        from group_submissions gs 
        inner join submissions s on s.id = gs.submission_id
        where gs.user_id = u.id and s.assignment_id = ?
    )

关于mysql - 在这种情况下如何做加入策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60600237/

相关文章:

mysql - MariaDB 转储仅创建数据库

MySQL - 具有计算关系的 PHP SELECT 表

sql - 在 SQL 中对分层文本进行排序

python - 使用peewee连接mysql时得到 “TypeError: Connect() got multiple values for keyword argument ' db'”

mysql - 基于另一个列值 ("foreign key to a view' s 列限制 MySQL 外键”)?

mysql - 没有 where 子句的连接查询

mysql - 为什么我不能再使用派生表的名称(子查询结果)?

sql - 自动增加 SQL Azure 配额

mysql - 如何编写多年来联合表的通用代码?

php - 存储过程中的 SQL 注入(inject)?