Каков наилучший способ запросить эту таблицу «Отдел-Сотрудник», чтобы получить отдел, в котором есть точные сотрудники?

Я использую MySQL 5.6. у меня три стола

Employee(id, ..... PRIMARY KEY (id))
Department(id, ...., PRIMARY KEY (id))
Department_Employee(d_id, e_id,
 FOREIGN KEY(d_ID) REFERENCES Department(id),
 FOREIGN KEY(e_id) REFERENCES Employee(id)
ADD CONSTRAINT PK_D_E_Mapping PRIMARY KEY (e_id, d_id) )

Отдел и Сотрудник имеют отношения многие-многие.

Допустим, мне дан список идентификаторов сотрудников (1, 2, 3), и мне нужно запросить таблицу Department_employee, чтобы получить Department_id, в котором есть только эти 3 сотрудника и больше никого.

Это то, что мне пока удалось придумать.

SELECT id 
  FROM 
     ( SELECT d_id 
         from Department_employee 
        where e_id in (1, 2, 3)
     ) 
 GROUP 
    BY id HAVING COUNT = 3;

Я чувствую, что определенно есть лучший способ сделать это.

Как можно улучшить этот запрос?

Ну и подзапрос не нужен - и id тут нет, так что не совсем правду говорите

Strawberry 18.12.2020 14:05

Обратите внимание, что всегда полезно явно указывать ПЕРВИЧНЫЙ КЛЮЧ в каждом случае, даже если вы думаете, что это очевидно.

Strawberry 18.12.2020 14:06

Отметил точку ПК. Спасибо!. Но, помимо подзапроса, как я могу подойти к этому?

riderProvider 18.12.2020 14:08

Что ж, когда вы обновите свой вопрос, я могу подумать о том, чтобы дать ответ ;-)

Strawberry 18.12.2020 14:09

Обновлено с необходимой информацией. :-)

riderProvider 18.12.2020 14:11

Вы пропустили один из столов!

Strawberry 18.12.2020 14:11

я почти уверен, что это хорошо. :-)

riderProvider 18.12.2020 14:16

Неа. Вам все еще не хватает ПК. Либо у вас есть суррогатный идентификатор - в этом случае нам нужно знать, существовал ли ключ UNIQUE в оставшихся столбцах, или (лучше?) PK просто формируется на (d_id,e_id) (кстати, я думаю, что это должно быть фантастически редкая в мире ситуация, когда сотрудник одновременно принадлежит более чем к одному отделу)

Strawberry 18.12.2020 14:18

Отдел и Сотрудник — это просто заполнители, xD. Я не думаю, что мне разрешено публиковать схемы непосредственно из базы данных компании. OOTH, я обновил таблицу PK для DE .. также спасибо за преподавание правильных стандартов.

riderProvider 18.12.2020 14:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
9
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете сгруппировать по идентификатору отдела и использовать GROUP_CONCAT(), чтобы установить условие в предложении HAVING:

SELECT d_id 
FROM Department_employee
GROUP BY d_id
HAVING GROUP_CONCAT(e_id ORDER BY e_id) = '1,2,3' -- the ids in ascending order

Или:

SELECT d_id 
FROM Department_employee
GROUP BY d_id
HAVING COUNT(*) = 3 AND SUM(e_id NOT IN (1, 2, 3)) = 0

Второй запрос был именно тем, что я искал. Спасибо!

riderProvider 18.12.2020 15:17

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