Как сделать стратегию объединения в этом случае? - PullRequest
3 голосов
/ 09 марта 2020

Я сталкиваюсь с такой ситуацией:

У меня есть 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 |
+----+---------------+---------+

Group_submissions

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

В таблице отправлений есть assignment_id, чтобы указать, к какому назначению относится представление.

Также пользователи могут отправить групповое представление, где тот, кто выполняет отправку, попадает в таблицу представлений, а остальные go в таблицу group_submissions. Таким образом, это будет считаться одной отправкой, а не 2,3 ... N представлением в зависимости от того, сколько людей в группе.

Как я могу получить пользователей, которые отправили представление или приняли участие в групповом представлении в заданном назначении?

Результат должен возвращать пользователя или пользователей, которые находятся в таблице представлений или в таблице 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 ]

1 голос
/ 09 марта 2020

Вы можете использовать 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 = ?
    )
0 голосов
/ 09 марта 2020

Я думаю, что профсоюз мог бы сделать это. Как это

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 = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...