2017-04-20 51 views
2

我有3個表: 1:取一個的計數以許多關係與2種不同表

id name 
1 jhon 

2:乙

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

3:C

id a_id name 
1 1 c1 

這裏一個有很多B和許多C

現在我需要的number of Bnumber of C計數它們與A. 有關我知道這裏2個不同的查詢能不能幫我找回B的數量,C這是屬於至A 如: -

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

我,試圖解決它與連接查詢EG->

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; 

,但它給錯誤的結果

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

這是因爲有圖3B這就是爲什麼我得到錯誤的結果用於使C 計數我可以用子查詢解決,但我不想與子查詢或2個不同的查詢來解決它。

夥計們您能否請我在這裏解決它與一個查詢而不使用子查詢在這裏。 在此先感謝。

回答

0

Distinct計數我已經實現了它的幫助。用Distinct計數將刪除重複計數的ID。

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

您可以使用子查詢,以獲得表BC的聚合版本:

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

'但是我不想與子query'解決它......不知道這是什麼OP希望(或者,如果什麼OP甚至有可能) –

+0

@TimBiegeleisen我看不到任何沒有任何子查詢的方式來解決這個問題。 –

0

請嘗試以下...

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; 

(解釋遵循... )

如果您有任何問題或意見,然後請隨時據此發佈評論。

+0

解釋添加到問題。 – toonice

+0

'GROUP ON A.id' ...認真嗎? –

+1

這相當於OP已經嘗試過的內容。它會返回'3'作爲'COUNT(c.a_id)'。 –

相關問題