нужны пользователи, которые находятся во всех четырех отделениях

#mysql #sql #phpmyadmin

#mysql #sql #phpmyadmin

Вопрос:

Проблема в том, что когда я запускаю код, он проверяет, был ли какой-либо человек в отделе 1, затем останавливается, но нужны только люди, которые были во всех четырех отделах

 SELECT
    p.person_id AS ID,
    CONCAT(p.firstname, " ", p.surname) AS 'Employee Name'
FROM
    person AS p, 
    allocation_to_department AS ad
WHERE
    ad.person_id = p.person_id
    AND ad.department_id= ('1,2,3,4')
  

Комментарии:

1. «он проверяет, был ли какой-либо человек в отделе 1, затем останавливается» … нет, он проверяет, находится ли человек в отделе 1 ИЛИ в отделе 2, или в отделе 3, или В отделе 4. Вот что IN делает — это просто короткий способ написания большого количества редакторов, о котором вы можете прочитать в любом руководстве по SQL

Ответ №1:

Вот сводный запрос, который вернет людей, которые принадлежат ко всем 4 отделам (id 1-4):

 SELECT
    p.person_id AS ID,
    CONCAT(p.firstname, " ", p.surname) AS 'Employee Name'
FROM
     person AS p
     INNER JOIN allocation_to_department AS ad
         ON ad.person_id = p.person_id          
GROUP BY 
    p.person_id, 
    p.first_name, 
    p.surname
HAVING 
    MAX(ad.department_id = 1) = 1
    MAX(ad.department_id = 2) = 1
    MAX(ad.department_id = 3) = 1
    MAX(ad.department_id = 4) = 1
  

Другим решением было бы использовать IN предложение и COUNT(DISTINCT ...) :

 SELECT
    p.person_id AS ID,
    CONCAT(p.firstname, " ", p.surname) AS 'Employee Name'
FROM
     person AS p
     INNER JOIN allocation_to_department AS ad
         ON ad.person_id = p.person_id
         AND ad.department_id IN (1, 2, 3, 4)
GROUP BY 
    p.person_id, 
    p.first_name, 
    p.surname
HAVING
    COUNT(DISTINCT ad.department_id) = 4
  

ПРИМЕЧАНИЕ: всегда используйте явные JOIN s вместо неявных объединений старой школы. Я соответствующим образом изменил запросы.

Ответ №2:

Вы можете сделать это, сгруппировав объединенные таблицы и выбрав только те строки, которые содержат все 4 department_id s:

 SELECT
  p.person_id AS ID,
  CONCAT(p.firstname, ' ', p.surname) AS `Employee Name`
FROM person AS p inner join allocation_to_department AS ad
on ad.person_id = p.person_id 
where ad.department_id in (1, 2, 3, 4)
group by ID, `Employee Name`
having count(*) = 4
  

Ответ №3:

Попробуйте это…

 SELECT p.person_id AS ID, CONCAT(p.firstname, " ", p.surname) AS 'Employee Name'
FROM person AS p, allocation_to_department AS ad
WHERE
ad.person_id = p.person_id 
AND
ad.department_id in (1,2,3,4)