Bonjour,
J'ai une table TABLE1 avec comme clé primaire ID.
J'ai ensuite deux tables TABLE2 et TABLE3 avec comme clé étrangère T1_ID qui pointe sur TABLE1.ID
Je souhaite récupérer en une seule requête par exemple le nombre de lignes de TABLE2 qui référencent une ligne de TABLE1, ainsi que le le nombre de lignes de TABLE3 qui référencent une ligne de TABLE1.
La tête dans le guidon, ça conduit à cette requête :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select table1.id, count(table2.*) nbt2, count(table3.*) nbt3 from table1 inner join table2 on table2.t1_id = table1.id inner join table3 on table3.t1_id = table1.id where table1.id = 1 group by table1.id;
Pour une raison X ou Y, je ne peux pas, dans mon cas, faire de count(distinct matable.champunique) car les clés de mes tables TABLE2 et TABLE3 sont composite et il n'y a aucun champ unique dedans.
J'ai alors la solution suivante :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 select tmp.id, tmp.nbt2, count(table3.*) nbt3 from ( select table1.id, count(table2.*) nbt2 from table1 inner join table2 on table2.t1_id = table1.id group by table1.id ) tmp inner join table3 on table3.t1_id = tmp.id where tmp.id = 1 group by tmp.id;
Ou encore :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select table1.id, count(table2.*) nbt2, (select count(table3.*) from table3 where table3.id = table1.id) nbt3 from table1 inner join table2 on table2.t1_id = table1.id where table1.id = 1 group by table1.id;
Mais ni l'une, ni l'autre des deux syntaxe n'est naturelle ni claire (et elles sont assez peu performantes).
Existe-t-il une autre solution ?
Partager