Оператор «In» в MySQL

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. Но окончательный выбор не выбирает соответствующее имя. Где это происходит не так?

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

Álvaro González 06.05.2024 09:09

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

jarlh 06.05.2024 09:10

Если у вас много идентификаторов, предложение EXISTS, скорее всего, будет работать намного лучше, чем оператор IN.

lemon 06.05.2024 10:22
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
3
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы выбираете всех сотрудников у менеджера, у которого более 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
);

Другие вопросы по теме