gpt4 book ai didi

父子关系的 MySql 查询优化

转载 作者:行者123 更新时间:2023-11-29 00:32:22 25 4
gpt4 key购买 nike

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

用户表

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的用户是Supervisor,有parentID的用户是该Parent supervisor下的Sales persons。

因此,我想获得主管及其销售人员的名单以及他们所做的操作系统调查。像下面这样的东西。

SuperVisorName     SurveyCount 
ABC1 10
ABC3 4
ABC4 6

ABC2 18
ABC5 18

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

这使得查询非常慢,从而导致超时错误。我们现在有 40k 的调查记录,并希望增加到 100k 以上。

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

如果您有任何问题,请告诉我。我会澄清这些。

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

最佳答案

试试这个查询

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

关于父子关系的 MySql 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com