1

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

用户表

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

在我们当前的系统中,我们首先获取所有主管,然后查看所有主管以获取他们的销售人员及其调查。

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

我对此进行了很少的搜索,我们发现 Union 可以在这方面提供帮助,但我不确定如何在我的场景中应用?我想这应该是完成上述结果的单个查询?

请让我知道,如果你有任何问题。我会澄清这些。

将感谢您对此的帮助。谢谢你的时间。

4

1 回答 1

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 小提琴

于 2013-04-10T17:39:05.620 回答