Employee:
+-----+-------+------------+-----------+
| id | name | department | managerId |
+-----+-------+------------+-----------+
| 101 | John | A | null |
| 102 | Dan | A | 101 |
| 103 | James | A | 101 |
| 104 | Amy | A | 101 |
| 105 | Anne | A | 101 |
| 106 | Ron | B | 101 |
+-----+-------+------------+-----------|
Из приведенной выше таблицы «Сотрудники» нам нужны имена менеджеров, которые управляют как минимум пятью сотрудниками.
Я придумал этот запрос:
select name from employee where managerid in (
select managerid from employee where managerid is not null group by managerid having count(*) > 4
);
Я ожидал следующего результата:
+------+
| name |
+------+
| John |
+------+
Но вместо этого выдает:
| name |
| ----- |
| Dan |
| James |
| Amy |
| Anne |
| Ron |
Предложениеwhere возвращает идентификатор менеджера как 101. Но окончательный выбор не выбирает соответствующее имя. Где это происходит не так?
Выполните автономный подзапрос и посмотрите, что я вернусь.
Если у вас много идентификаторов, предложение EXISTS, скорее всего, будет работать намного лучше, чем оператор IN.


Вы выбираете всех сотрудников у менеджера, у которого более 4 сотрудников. Вам нужно изменить предложениеwhere, чтобы фильтровать по id вместо managerid:
select name from employee where id in (
select managerid
from employee
where managerid is not null
group by managerid having count(*) > 4
);
Потому что вы выполняете запрос по идентификатору менеджера и получаете имя управляемого сотрудника. Я думаю, вы хотите запросить по идентификатору.