J'ai 3 tables: 1: A

id   name
1    jhon

2: B

id a_id name
1    1   b1
2    1   b2
3    1   b3

3: C

id a_id name
1    1   c1

Ici A ont beaucoup de B et beaucoup de C

Maintenant j'ai besoin d'un nombre de number of B et number of C qui sont associés à A. Je sais ici que 2 requêtes différentes peuvent m'aider à récupérer le nombre de B, C qui appartiennent à A par exemple:-

 select count(id) from B where a_id=1;
  select count(id) from C where a_id=1;

J'essaie de le résoudre avec une requête de jointure, par exemple->

select count(b.id) , count(c.id) from A  a
left join B b on b.a_id = a.id
left join C c on c.a_id = a.id
where a.id = 1;

Mais ça donne le mauvais résultat

count(b.id) count(c.id)
3            3

C'est parce que j'ai 3 B c'est pourquoi j'obtiens un mauvais résultat pour le nombre de C Je peux le résoudre avec une sous-requête mais je ne veux pas le résoudre avec une sous-requête ou 2 requêtes différentes.

Les gars pouvez-vous me faire plaisir ici pour le résoudre avec une requête sans utiliser de sous-requête ici. Merci d'avance.

2
Bhushan Uniyal 20 avril 2017 à 09:30

3 réponses

Meilleure réponse

Avec l'aide de Distinct count, je l'ai atteint. count with Distinct supprimera le comptage des identifiants en double.

select count(Distinct b.id) , count(Distinct c.id) from A  a
left join B b on b.a_id = a.id
left join C c on c.a_id = a.id
where a.id = 1;
0
Bhushan Uniyal 21 avril 2017 à 14:32

S'il vous plaît essayez ce qui suit...

SELECT A.id as id,
       countB,
       countC
FROM A
LEFT JOIN ( SELECT a_id AS id,
                   COUNT( a_id ) as countB
            FROM B
            GROUP BY a_id
          ) B_ids ON A.id = B_ids.id
LEFT JOIN ( SELECT a_id AS id,
                   COUNT( a_id ) as countC
            FROM C
            GROUP BY a_id
          ) C_ids ON A.id = C_ids.id
GROUP BY id
ORDER BY id;

(Explication à suivre ...)

Si vous avez des questions ou des commentaires, n'hésitez pas à publier un commentaire en conséquence.

0
toonice 20 avril 2017 à 07:36

Vous pouvez utiliser une sous-requête pour obtenir une version agrégée des tables B, C:

SELECT A.*, B.cnt_b, C.cnt_c
FROM A
LEFT JOIN (
   SELECT a_id, COUNT(*) AS cnt_b
   FROM B
   GROUP BY a_id
) AS B ON A.a_id = B.a_id
LEFT JOIN (
   SELECT a_id, COUNT(*) AS cnt_c
   FROM C
   GROUP BY a_id 
) AS C ON A.a_id = C.a_id
WHERE A.a_id = 1
0
Giorgos Betsos 20 avril 2017 à 06:39