父子关系的MySql查询优化

时间:2013-04-10 16:47:03

标签: mysql database query-optimization parent-child union

我遇到了大型数据库的问题,其中一个查询显然不正确,我在数据库方面也不好,所以我不确定我可以做些什么来优化这个查询。下面是我的表结构,并详细说明了我需要获取的数据。

用户表

UserID    UserName    UserRole    ParentID
  1        ABC1            2          0
  2        ABC2            2          0
  3        ABC3            2          1
  4        ABC4            2          1
  5        ABC5            2          2

调查表结构

SurveryID     SurveyTitle      UserID
   1           S1                3
   2           S2                3
   3           S3                4
   4           S4                4
   3           S3                4
   4           S4                5
   3           S3                3
   4           S4                5
   3           S3                3
   4           S4                4

没有parentID的用户是主管,拥有parentID的用户是该主管主管下的销售人员。

所以,我想通过他们的销售人员获得他们所做的数字操作调查的主管名单。像下面的东西。

SuperVisorName     SurveyCount 
ABC1                    10
     ABC3           4    
     ABC4           6

ABC2                     18
     ABC5           18

在我们目前的系统中,我们首先获得所有主管,然后通过所有主管查看他们的销售人员进行调查。

这使得查询非常慢,从而导致超时错误。我们现在有4万条调查记录,希望增长超过10万。

我搜索的很少,我们发现Union可以提供帮助,但我不确定如何在我的场景中应用?我想这应该是一个单一的查询来完成所述结果?

如果您有任何疑问,请与我们联系。我会澄清这些。

非常感谢您的帮助。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

尝试此查询

select 
   if(a.username is null, b.username, a.username) as username, 
   a.parentid, -----if(a.username is null, 0, a.parentid) parentid,  
   a.cnt       -----Replace above line if you want value to be 0 of parentId
from
   (select 
       parentid, 
       username,  
       count(*) cnt 
   from 
       tbl1 a 
   inner join 
       tbl2 b
   on 
       a.userid = b.userid
   group by 
       parentid, 
       username 
   with rollup) a
inner join
   tbl1 b
on 
   a.parentid = b.userid

<强>结果:

| USERNAME | PARENTID | CNT |
-----------------------------
|     ABC3 |        1 |   4 |
|     ABC4 |        1 |   4 |
|     ABC1 |        1 |   8 |
|     ABC5 |        2 |   2 |
|     ABC2 |        2 |   2 |

SQL FIDDLE