Удовлетворяют ли люди в таблице следующее условие - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующие таблицы:

Стол ученика

| id | name     | gender|
|----|----------|-------|
| 1  | April    |  F    |
| 2  | Jane     |  F    |
| 3  | Joe      |  M    |
| 4  | Mike     |  M    |

Таблица проекта

| project_id | student_id | project_name|
|------------|------------|-------------|
| 101        | 1          |  Alpha      |
| 101        | 2          |  Alpha      |
| 101        | 3          |  Alpha      |
| 102        | 2          |  M          |
| 102        | 4          |  M          |
| 103        | 1          |  Beta       |
| 103        | 3          |  Beta       |

Предположим там намного больше студентов и идентификаторов проектов. В одном проекте могут работать несколько студентов.

У меня такой вопрос, как в таблицах выше, как я могу проверить, сколько студентов работали вместе над двумя или более проектами? Таким образом, в приведенном выше примере студенты с идентификаторами 1 и 3 работали вместе в проекте Alpha и Beta.

Пока мой код

SELECT * FROM student s
JOIN project s ON student.id = project.project_id

Я знаю, что хочу объединить обе таблицы столбец они разделяют (который является идентификатором студента), но я понятия не имею, что делать после. Я новичок в SQL только неделю обучения и буду признателен за большую помощь.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Использование самостоятельного объединения и агрегирования:

select p1.student_id, p2.student_id, count(*) as num_projects
from projects p1 join
     projects p2
     on p1.project_id = p2.project_id and
        p1.student_id < p2.student_id
group by p1.student_id, p2.student_id
having count(*) > 1
order by count(*) desc;
0 голосов
/ 19 февраля 2020

Рассмотрим:

select count(*)
from (
    select 1
    from projects p1
    inner join projects p2 
        on p2.project_id = p1.project_id and p2.student_id < p1.student_id
    group by p1.student_id, p2.student_id
    having count(*) > 1
) t

Внутренний запрос самостоятельно присоединяется к таблице проекта и генерирует уникальные кортежи студентов, которые работали над одним проектом; предложение having фильтрует кортежи, которые работали вместе над несколькими проектами.

Внешний запрос просто подсчитывает количество кортежей.

...