MySQL:子查询WHERE IN(来自连接的结果)

时间:2018-05-04 16:35:25

标签: mysql

我的查询初始化用户。从那里它抓住了用户完成的所有活动。我收回一些数据,然后我还要加入销售。我编写了一个子查询来获取销售结果,但是,销售与用户无关,因此我需要获取account_id为用户活动已完成的所有销售。

此查询有效,但速度非常慢。当我执行s.account_id IN(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",

1 个答案:

答案 0 :(得分:0)

你可以简单地使用内连接来避免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