MySql 查询优化父子关系

Posted

技术标签:

【中文标题】MySql 查询优化父子关系【英文标题】:MySql Query Optimization for parent child relationship 【发布时间】:2013-04-10 16:47:03 【问题描述】:

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

用户表

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 可以在这方面提供帮助,但我不确定如何在我的场景中应用?我想这应该是完成上述结果的单个查询?

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

感谢您在这方面的帮助。谢谢你的时间。

【问题讨论】:

如何获得调查计数?通过统计调查表中的用户 ID 数? 【参考方案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

【讨论】:

优秀的@Meherzad!比我的回答简洁多了。我将删除我的以避免混淆。 @Meherzad,感谢您的回答。我很快就会尝试这个,并会告诉你进展如何。 好吧,我有机会玩你的查询。似乎我对此有一个问题。我没有得到作为主管的用户。我只得到具有 parentID 的子用户,而不是具有 parentID=0 的子用户(意味着他们是主管)。有什么想法吗? 为了更清楚地说明,根据您的查询,实际结果中不会有 ABC1 和 ABC2 记录。即使他们没有任何父母,我也不确定您如何获得 ParentID=1 & 2 ?如果您有任何问题,请告诉我。另外,关于调查计数,是的,我会计算记录数。 ABC1 和 ABC2 是根据这些样本记录的主管,主管的调查计数等于下属调查计数的总和。根据小提琴ABC1 是 3 和 4 的主管,所以他的调查计数是8,即4+4。如果我对问题的理解有误,请纠正我...

以上是关于MySql 查询优化父子关系的主要内容,如果未能解决你的问题,请参考以下文章

mysql中主查询和子查询关系是啥?

MySQL查询父子关系

多对一优化mysql选择查询

MySql查询优化方法总结

如何让MySQL中单句实现无限层次父子关系查询

MySQL优化