我想要的是一个活动的参与者(作为参与者的人),与参与者相同公司的人员,但他们的角色是经理。
一个人的角色是person_role_membership中的商店,但一个人的公司存储在People中。我已经精心设计了以下查询,我认为这项工作做得很好。请忽略额外的连接和信息。我正在抓住所有参与者,然后与所有经理联合,我再一次吸引所有参与者。现在问题在于整个查询,因为一小部分需要花费9秒。有没有办法让它更快?
select distinct *
from
(
SELECT
p.id as p_id, p.first_name as p_first_name, p.last_name as p_last_name,p_r.name as p_role,
p.job_title as p_job_title,
p_d.email as p_email, p_d.phone_1 as p_phone, p_d.phone_ext_1 as p_ext,
c.name as p_company, p_c.name as p_parent_company
FROM person_role_memberships as prm
left join people as p on prm.person_id = p.id and prm.person_role_id between 32 and 35
left join person_roles as p_r on p_r.id = prm.person_role_id
left join person_details as p_d on p.id = p_d.person_id and p_d.type = 'BusinessDetail'
left join companies as c on c.id = p.company_id
left join companies as p_c on p_c.id = p.parent_company_id
where
p.id is not null
) as parts
union (
select p.id, p.first_name,p.last_name,prm.person_role_id, p.job_title, 'cp email', 'phone','ext',c.name, d.name
from people as p -- All those people
left join person_role_memberships as prm on prm.person_id = p.id -- whose roles are like this
left join companies as c on p.company_id = c.id
left join companies as d on c.parent_id = d.id
-- and whose companies are like those people whose roles are like this
where company_id = any
(
select company_id from people as p
left join person_role_memberships as prm on prm.person_id = p.id
where prm.person_role_id between 32 and 35-- and other conditions;
)
and (person_role_id = 14 or person_role_id = 15))
答案 0 :(得分:0)
我的猜测是,查询中的“任意”部分会降低速度。根据它的外观,我认为你甚至不需要它,因为你可以直接过滤person_role_memberships:
select p.id, p.first_name,p.last_name,prm.person_role_id, p.job_title, 'cp email', 'phone','ext',c.name, d.name
from people as p -- All those people
left join person_role_memberships as prm on prm.person_id = p.id -- whose roles are like this
left join companies as c on p.company_id = c.id
left join companies as d on c.parent_id = d.id
-- and whose companies are like those people whose roles are like this
where prm.person_role_id between 32 and 35 -- and other conditions;
and (person_role_id = 14 or person_role_id = 15))
'any'语句导致数据库查看每个记录的整个PEOPLE表。