1

明らかに正しくないクエリの 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

親 ID を持たないユーザーはスーパーバイザーであり、親 ID を持つユーザーはその親スーパーバイザーの下の営業担当者です。

だから、スーパーバイザーとその営業担当者が行ったOS調査の数のリストを取得したいと思います。以下のようなもの。

SuperVisorName     SurveyCount 
ABC1                    10
     ABC3           4    
     ABC4           6

ABC2                     18
     ABC5           18

現在のシステムでは、最初にすべてのスーパーバイザーを取得し、次にすべてのスーパーバイザーを調べて、調査で営業担当者を取得します。

これにより、クエリが非常に遅くなり、タイムアウト エラーが発生します。現在、調査対象のレコードが 40,000 件あり、100,000 件以上増加することを望んでいます。

私はそれについてほとんど検索しませんでしたが、ユニオンがこれに役立つことがわかりましたが、私のシナリオに適用する方法がわかりませんか? これは、上記の結果を達成するための単一のクエリであると思いますか?

ご不明な点がございましたら、お知らせください。それらを明確にします。

これについてあなたの助けに感謝します。御時間ありがとうございます。

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 に答える