我遇到了大型数据库的问题,其中一个查询显然不正确,我在数据库方面也不好,所以我不确定我可以做些什么来优化这个查询。下面是我的表结构,并详细说明了我需要获取的数据。
用户表
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可以提供帮助,但我不确定如何在我的场景中应用?我想这应该是一个单一的查询来完成所述结果?
如果您有任何疑问,请与我们联系。我会澄清这些。
非常感谢您的帮助。谢谢你的时间。
答案 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 |