Я использую 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;
Я чувствую, что определенно есть лучший способ сделать это.
Как можно улучшить этот запрос?
Обратите внимание, что всегда полезно явно указывать ПЕРВИЧНЫЙ КЛЮЧ в каждом случае, даже если вы думаете, что это очевидно.
Отметил точку ПК. Спасибо!. Но, помимо подзапроса, как я могу подойти к этому?
Что ж, когда вы обновите свой вопрос, я могу подумать о том, чтобы дать ответ ;-)
Обновлено с необходимой информацией. :-)
Вы пропустили один из столов!
я почти уверен, что это хорошо. :-)
Неа. Вам все еще не хватает ПК. Либо у вас есть суррогатный идентификатор - в этом случае нам нужно знать, существовал ли ключ UNIQUE в оставшихся столбцах, или (лучше?) PK просто формируется на (d_id,e_id) (кстати, я думаю, что это должно быть фантастически редкая в мире ситуация, когда сотрудник одновременно принадлежит более чем к одному отделу)
Отдел и Сотрудник — это просто заполнители, xD. Я не думаю, что мне разрешено публиковать схемы непосредственно из базы данных компании. OOTH, я обновил таблицу PK для DE .. также спасибо за преподавание правильных стандартов.
Вы можете сгруппировать по идентификатору отдела и использовать 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
Второй запрос был именно тем, что я искал. Спасибо!
Ну и подзапрос не нужен - и
id
тут нет, так что не совсем правду говорите