#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)