在这种情况下,如何执行加入策略?

时间:2020-03-09 12:05:50

标签: 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数据库。

2 个答案:

答案 0 :(得分:1)

您可以使用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 = ?
    )

答案 1 :(得分:0)

我认为工会可以做到。像这样

select * from
(
    select u.*, assignment_id, 'assignment_submissions' as type from users u
    inner join assignment_submissions ass on u.id= ass.student_id
    union
    select u.*, assignment_id, 'group_submissions' from users u
    inner join group_submissions gs on u.id = gs.student_id
    inner join assignments a on a.id = ass.assignment_id
)a
where assignment_id = ?