хотят людей, которые находятся во всех четырех отделениях - PullRequest
1 голос
/ 28 марта 2019

Проблема в том, что когда я запускаю код, который он проверяет, чтобы увидеть, был ли кто-нибудь в отделе 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')

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Вот агрегированный запрос, который вернет лиц, принадлежащих ко всем 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 вместо старой школы, неявный присоединяется.Я изменил запросы соответственно.

0 голосов
/ 28 марта 2019

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

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)
0 голосов
/ 28 марта 2019

Вы можете сделать это, сгруппировав объединенные таблицы и выбрав только те строки, которые имеют все 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...