2015-04-23 89 views
1

我有3個表,我試圖把連接查詢如下。MySQL查詢與左連接,計數和組與3表

以下是包含3個部分的部分表格。

Section 
***************************** 
* section_id * section_name * 
***************************** 
* 1   * A   * 
* 2   * B   * 
* 3   * C   * 
***************************** 

以下是section_subject表。第一部分包含2個主題,第二部分包含2個主題,第三部分包含3個主題。

Section_Subject 
*********************************** 
* ss_id * section_id * subject_id * 
*********************************** 
* 1  * 1   * 8   * 
* 2  * 1   * 9   * 
* 3  * 2   * 6   * 
* 4  * 2   * 5   * 
* 5  * 3   * 2   * 
* 6  * 3   * 3   * 
* 7  * 3   * 4   * 
*********************************** 

以下是section_batch表。第3節獨含2個批次

Section_Batch 
********************************* 
* sb_id * section_id * batch_id * 
********************************* 
* 1  * 3   * 6  * 
* 2  * 3   * 7  * 
********************************* 

我想查詢產生以下結果

************************************************************** 
* section_id * section_name * count_subjects * count_batches * 
************************************************************** 
* 1   * A   * 2    * 0    * 
* 2   * B   * 2    * 0    * 
* 3   * C   * 3    * 2    * 
************************************************************** 

我知道我們可以做一些類的子查詢,實現了上述結果。但如何使用左連接和組查詢來獲得結果?

回答

1

我相信使用count(distinct)會給你你需要的。您必須使用distinct,因爲連接在一個部分具有多個主題和多個批次的情況下具有乘數效應。

select 
    s.section_id, 
    min(t1.section_name) as section_name, 
    count(distinct ss.subject_id) as subject_count, 
    count(distinct sb.batch_id) as batch_count, 
from 
    Section as s 
    left join Section_Subject as ss on ss.section_id = s.section_id 
    left join Section_Batch as sb on sb.section_id = s.section_id 
group by 
    s.section_id 

順便說一下,我認爲左連接可能是內連接。

1

您可以使用countdistinct

select t1.section_id 
    , t1.section_name 
    , count(distinct t2.subject_id) as count_subjects 
    , count(distinct t3.batch_id) as count_batches 
from Section t1 
left join Section_Subject t2 on t1.section_id = t2.section_id 
left join Section_Batch t3 on t1.section_id = t3.section_id 
group by t1.section_id 
     , t1.section_name 

SQLFiddle

+0

@notulysees 3部分的count_subjects&count_batches顯示6哪個是錯誤的。 – Malaiselvan

2

你需要單獨做left joingroup by每個表,以獲得計數,然後做他們

SQL小提琴之間的連接:http://www.sqlfiddle.com/#!9/ea4ee/12

select T1.section_id, 
     T1.section_name, 
     T1.subjects_count, 
     T2.batch_count 
FROM (
select S.section_id, 
     S.section_name, 
     COUNT(SS.subject_id) as subjects_count 
from Section S 
LEFT JOIN Section_Subject SS 
on S.section_id = SS.section_id 
group by S.section_id, S.section_name)T1 
LEFT JOIN (
select S.section_id, 
     S.section_name, 
     COUNT(SB.batch_id) as batch_count 
from Section S 
LEFT JOIN Section_Batch SB 
on S.section_id = SB.section_id 
group by S.section_id, S.section_name 
) T2 
on T1.section_id = T2.section_id 
+0

您的解決方案可行,但我不確定此查詢的性能,因爲它執行多個選擇和分組依據。 – Malaiselvan

+0

@Malaiselvan你可以測試。這種類型的解決方案通常更高效。特別如果你有超過2個表連接到基表。想象一下,有6個而不是2個。我敢打賭,這種類型的6個獨立的組,然後是6個連接,而不是一個巨大的7個表連接,然後分組。 –

+0

請在我的姊妹網站dba.se的類似問題中查看我的答案:[Help with this query](http://dba.stackexchange.com/questions/17012/help-with-this-query/17016#17016) –