2017-01-11 20 views
1

私は自分のアプリケーション内にユーザーテーブルを持っています。SQLクエリを最適化

Id Name ParentId 
1 User1 0 
2 User2 1 
3 User3 1 
4 User4 2 
5 User5 2 

ユーザーはgrandparent-> parent-> childのような関係を持っています。私は次のクエリに

select * from user where ParentId=1 or ParentId in(select id from user where ParentId=1) 

を使用している壮大な親に関連するユーザーを取得するためにも、これらのユーザーは、私の役割テーブルに複数の役割を持っており、ユーザーが持つルールの数を取得するために、私はselect count(*) from group where userId=1を使用しています。

Id Role UserId 
1 Role 1 1 
2 Role 2 1 
3 Role 3 2 
4 Role 4 2 
5 Role 5 3 

私は、SQLとの良好な単一のクエリ.I'mないでこれらの両方のデータをフェッチする必要があると私は私の最初のクエリは完璧ではありません知っています。どうすればこれを実現できますか?

+1

「両方のデータを単一のクエリで取得する必要があります」=>どのように?サンプルデータも 'group'テーブルから与えて、それに基づいて期待される出力を表示できますか? – Utsav

答えて

1

あなたのクエリはあなたのロールテーブルと結合する必要があります。

SELECT u.id, count(r.id) no_of_roles 
FROM user u left join roles r 
on u.id = r.userid 
WHERE u.ParentId=1 
OR u.ParentId IN 
    (SELECT id FROM t WHERE ParentId=1 
) 
group by u.id;