问题是,当我运行代码时,它会检查是否有人在部门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
答案 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)