Выберите COUNT из разных таблиц - PullRequest
0 голосов
/ 18 декабря 2018

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

create table teacher (
   id INT NOT NULL UNIQUE,
   name VARCHAR(50) NOT NULL,
   lastname VARCHAR(50) NOT NULL
);

create table Course (
   id INT NOT NULL UNIQUE,
   name VARCHAR(50) NOT NULL,
   teacher_id INT NOT NULL
);

Итак, что у меня есть, например, что-то вроде этого

| id | name     | lastname  | 
-----------------------------
| 1  | teacher1 | lastname1 |
| 2  | teacher2 | lastname2 |

| id | name     | teacher_id |
------------------------------
| 1  | course1  | 1          |
| 2  | course2  | 1          |
| 3  | course4  | 2          |

Пока все работает нормально, но по требованию мне нужно вернуть список учителей и сколько курсов преподаеткак:

| id | name     | lastname   | courses  |
----------------------------------------
| 1  | teacher1 | lastname1  |  2       |
| 2  | teacher2 | lastname2  |  1       |

Я не могу найти решение, которое бы приспособилось к этому требованию.Я пробовал с HAVING и GROUP BY предложениями из MySql, но, похоже, это не работает так, как мне нужно.

Ответы [ 3 ]

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

это должно сработать:

select t.id, t.name, t.lastname, count(t.id) as courses
from course c
join teacher t on t.id = c.teacher_id
group by t.id
0 голосов
/ 18 декабря 2018

Вы можете использовать левое соединение, используя таблицу учителя в качестве левой таблицы.Он выберет всех учителей из таблицы учителей, и вы сможете получить их идентификатор курса.Если у учителя нет курса, он все равно возвращает запись учителя, но с нулевым идентификатором курса.Оттуда вы можете рассчитывать на идентификатор курса.См. Ниже:

select a.id,
a.name,
a.lastname,
count(distinct b.id) as courses
from teacher a
left join courses b on a.id=b.teacher_id
group by a.id,
a.name,
a.last_name;

Вот изображение, иллюстрирующее различные типы соединений https://www.google.fr/amp/s/amp.reddit.com/r/programming/comments/1xlqeu/sql_joins_explained_xpost_rsql/

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

A GROUP BY должно работать нормально:

SELECT
    t.id,
    t.name,
    t.lastname,
    COUNT(DISTINCT course.id) AS courses
FROM teacher AS t
LEFT OUTER JOIN Courses AS c
    ON c.teacher_id = t.id
GROUP BY
    t.id,
    t.name,
    t.lastname
...