SQL - Поиск студентов, берущих 2 или более классов - PullRequest
0 голосов
/ 12 декабря 2018

У меня был этот вопрос в интервью, и я не мог понять это.У меня есть три таблицы: таблица учеников, таблица классов и таблица, связывающая две другие.Вот базовая схема для них.

STUDENT
student_id | student_name
-----------+-------------
int        | varchar(30)

CLASS
class_id | class_name
---------+-----------
int      | varchar(30)

ROSTERS
student_id | class_id
-----------+---------
int        | int

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

Ответы [ 5 ]

0 голосов
/ 12 декабря 2018
SELECT COUNT(class_id), student_id 
FROM Rosters 
GROUP BY student_id 
HAVING COUNT(class_id) >=2 

Это самый простой способ сделать это ИМО.

0 голосов
/ 12 декабря 2018

Вам необходимо объединить две таблицы, STUDENT и ROSTERS (я использовал внутреннее объединение, при необходимости это можно изменить в соответствии с требованиями), считая количество уроков, которые посещает каждый студент.

SELECT s.student_name, 
    COUNT(r.class_id) AS count
FROM 
    STUDENT s
INNER JOIN 
    ROSTERS r 
ON 
    r.student_id = s.student_id
GROUP BY 
    s.student_id
HAVING 
    count >= 2
0 голосов
/ 12 декабря 2018

это будет работать:

select  s.*,r.*,c.*,count(*) 
from 
student s,
class c,
rosters r where
s.student_id=r.student_id and
c.class_id=r.class_id
group by s.student_id 
having count(*)>=2
0 голосов
/ 12 декабря 2018

Вы можете использовать join, count, having и group by, чтобы получить требуемый результат:

select r.student_id,s.student_name,count(*) 
from STUDENT s inner join ROSTERS r
on s.student_id = r.student_id
group by r.student_id,s.student_name
having count(*)>=2;
0 голосов
/ 12 декабря 2018

Этот запрос будет делать то, что вы хотите:

SELECT s.student_name, COUNT(DISTINCT r.class_id) AS num_classes
FROM student s
LEFT JOIN rosters r ON r.student_id = s.student_id
GROUP BY s.student_id
HAVING num_classes >= 2

Он подсчитывает все различные значения class_id в roster для каждого учащегося (num_classes) и возвращает только учеников с 2 или более (HAVING num_classes >= 2).

Примечание. Я использовал LEFT JOIN, чтобы поймать всех учеников, однако, поскольку вы хотите, чтобы только те, у кого более 1 класса, в этом нет необходимости, и вы можете использовать прямую JOIN.

Также обратите внимание, что JOIN таблица class для этого вопроса не обязательна, однако, если вы хотите указать названия классов, которые посещал студент, вам потребуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...