繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM