[英]MySQL: Subquery WHERE IN (Result from join)
我的查询初始化用户。 从那里抓取用户完成的所有活动。 我得到一些数据,然后我还需要加入销售。 我已经编写了一个子查询来获取销售结果,但是,销售与用户无关,因此我需要获取account_id位于用户活动已完成的所有销售。
该查询有效,但是非常慢。 当我只执行s.account_id(activity.account_id)时,它不会带回正确的数字。
select t.name as team, u.name as "REP NAME",
count(distinct (case when activity.tag='visit' then activity.id
end)) as "TOTAL VISITS",
count(distinct (case when activity.tag='visit' then
activity.account_id end)) as "UNIQUE VISITS",
ROUND((select sum(s.volumece) from lpmysqldb.sales s where
s.org_id='555b918ae4b07b6ac5050852'
and s.account_id IN (select
account_id from lpmysqldb.activity where
org_id='555b918ae4b07b6ac5050852' and user_id=u.id and
(completed_at between '2018-04-01' and '2018-04-04') and
tag='visit' and accountname is not null and (status='active' or
status='true' or status='1'))
and (s.invoice_date between
DATE_FORMAT(CURDATE(), '%Y-01-01') and DATE_FORMAT(CURDATE(), '%Y-
%m-%d'))),2) as "CURRENT YEAR VOLUME"
from lpmysqldb.users u
left join lpmysqldb.teams t on t.team_id=u.team_id
left join lpmysqldb.activity activity on
activity.org_id='555b918ae4b07b6ac5050852' and activity.user_id=u.id
and (activity.completed_at between '2018-04-01' and '2018-04-04')
and activity.accountname is not null and (activity.status IN
('1','active','true','') OR activity.status IS NULL)
where u.org_id='555b918ae4b07b6ac5050852'
and u.status IN ('active','true','1')
and istestuser!='1'
group by u.org_id, t.name, u.id, u.name
为了便于查看,我将有问题的部分隔开。 我不是专家,因此这里的任何帮助将不胜感激!
我相信这就是答案(似乎可以更快地工作)
ROUND((select sum(s.volumece)
from lpmysqldb.sales s
INNER JOIN ( select *
from lpmysqldb.activity
where org_id='555b918ae4b07b6ac5050852'
and (completed_at between '2018-04-01' and '2018-04-
04')
and tag='visit'
and accountname is not null
and (status='active' or status='true' or status='1'))
T on T.account_id = s.account_id
where s.org_id='555b918ae4b07b6ac5050852'
and T.user_id=u.id
and (s.invoice_date between DATE_FORMAT(CURDATE(), '%Y-01-01') and
DATE_FORMAT(CURDATE(), '%Y-%m-%d'))
),2) as "CURRENT YEAR VOLUME",
您可以简单地使用内部联接来避免IN子句,例如:
select t.name as team, u.name as "REP NAME",
count(distinct (case when activity.tag='visit' then activity.id
end)) as "TOTAL VISITS",
count(distinct (case when activity.tag='visit' then
activity.account_id end)) as "UNIQUE VISITS",
ROUND((
select sum(s.volumece)
from lpmysqldb.sales s
INNER JOIN (select
account_id from lpmysqldb.activity where
org_id='555b918ae4b07b6ac5050852' and user_id=u.id and
(completed_at between '2018-04-01' and '2018-04-04') and
tag='visit' and accountname is not null and (status='active' or
status='true' or status='1')) T on T.account_id = s.account_id
where s.org_id='555b918ae4b07b6ac5050852'
and (s.invoice_date between
DATE_FORMAT(CURDATE(), '%Y-01-01') and DATE_FORMAT(CURDATE(), '%Y-
%m-%d'))),2) as "CURRENT YEAR VOLUME"
from lpmysqldb.users u
left join lpmysqldb.teams t on t.team_id=u.team_id
left join lpmysqldb.activity activity on
activity.org_id='555b918ae4b07b6ac5050852' and activity.user_id=u.id
and (activity.completed_at between '2018-04-01' and '2018-04-04')
and activity.accountname is not null and (activity.status IN
('1','active','true','') OR activity.status IS NULL)
where u.org_id='555b918ae4b07b6ac5050852'
and u.status IN ('active','true','1')
and istestuser!='1'
group by u.org_id, t.name, u.id, u.name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.