希望所有四个部门中的人

时间:2019-03-27 23:01:43

标签: mysql sql phpmyadmin

问题是,当我运行代码时,它会检查是否有人在部门1中,然后停下来,但只希望所有四个部门中的人都在

def get_profiles(text):
    qs = Profile.objects.all()
    for term in text.split():
        qs = qs.filter( Q(name__icontains = term) | Q(surname__icontains = term))
    return qs

3 个答案:

答案 0 :(得分:2)

这是一个汇总查询,将返回属于所有4个部门(标识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

NB:始终使用 explicit JOIN代替老式的隐式连接。我相应地修改了查询。

答案 1 :(得分:0)

您可以通过对联接的表进行分组并仅选择具有全部4个department_id的行来做到这一点:

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

答案 2 :(得分:0)

尝试一下...

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)