2017-01-11 2 views
1

Ich habe eine Benutzertabelle in meiner Anwendung.optimieren SQL Abfrage

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

Die Benutzer haben eine Beziehung wie Großeltern-> Eltern-> Kind. die Benutzer zu einem groß Eltern Ich verwende die folgende Abfrage mehr Rollen in meiner Rolle Tabelle und zum Abrufen der Zählung von Regeln ein Benutzer mit, ich bin mit select count(*) from group where userId=1 Bezug zu holen

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

auch diese Benutzer haben.

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

Ich brauche diese beiden Daten in einer einzigen Abfrage .I'm nicht gut mit SQL zu holen, und ich weiß, dass meine erste Abfrage nicht perfekt ist. Wie kann ich das erreichen?

+1

'müssen diese beiden Daten in einer einzigen Abfrage holen' => Wie? Können Sie auch Beispieldaten aus der 'group' Tabelle geben und darauf basierend Ihre erwartete Ausgabe anzeigen? – Utsav

Antwort

1

Ihre Abfrage muss nur mit Ihrer Rollentabelle verknüpft werden.

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;