2014-09-29 102 views
2

我有三個表:3表的SQL查詢

niveis(id, descricao) 
formacoes(id, id_nivel, nome) 
formacoes_professores(id, id_professor, id_formacao) 

我想運行一個返回教育水平(niveis)與具有它教授的數量的查詢。

我運行此查詢:

SELECT n.descricao, count(f.id_nivel) 
FROM niveis_de_formacao n 
LEFT OUTER JOIN formacoes f 
ON (n.id = f.id_nivel) 
GROUP BY n.descricao 

而且我得到這個結果:

descricao count 
Mestrado 0 
Graduação 2 
Doutorado 0 
Especialização 0 

好像我想要做的事。但在這個查詢中,我只是計算了一個教育級別的課程數量。 我能做些什麼來查詢formacoes_professores表格並計算教育水平有多少教授。

例如,如果三位教授有相同的課程(讓我們假設它是一個碩士學位),查詢需要返回:

Mestrado 3 

但在查詢我跑,而不是三個,我會得到Mestrado 1,因爲它是相同的課程。

謝謝。

+0

嘗試編輯您的問題,幷包括示例數據。您的查詢看起來正確。如果「Mestrado」的值爲0,則數據似乎不包含該級別的任何內容。 – 2014-09-29 19:07:13

+0

好吧,但我正在計算一個教育級別的課程數量。我需要做的是統計一個教育級別的「教授」數量。例如,如果三位教授具有相同的課程,則該查詢應返回三級,但在查詢中,我將運行它將返回1 – ahmm95 2014-09-29 19:11:19

回答

0

您是否只需要添加連接?並使計數明顯?

SELECT n.descricao, count(distinct f.id_nivel), count(distinct fp.id_professor) 
FROM niveis_de_formacao n 
LEFT OUTER JOIN formacoes f 
    ON (n.id = f.id_nivel) 
LEFT OUTER JOIN formacoes_professores fp 
    ON f.id = fp.id_formacao 
GROUP BY n.descricao 
+0

謝謝,它工作!我還沒有理解它,但它工作。我會深深地看,謝謝。 – ahmm95 2014-09-29 19:17:14

+0

這次加入帶來了你在原始查詢中沒有的教授,獨特的計數是必要的,否則每位教授都會重複使用formacoes來增加計數,因此也需要在那裏區分。 – xQbert 2014-09-29 19:23:10

0

看來你還想讓教授數。我建議使用具有教授人數的派生表並將其加入。

SELECT t1.* , COALESCE(t2.cnt,0) professor_count 
FROM (
    SELECT n.id, n.descricao, count(f.id_nivel) education_count 
    FROM niveis_de_formacao n 
    LEFT OUTER JOIN formacoes f 
    ON (n.id = f.id_nivel) 
    GROUP BY n.id, n.descricao 
) t1 LEFT OUTER JOIN (
    SELECT count(*) cnt, f.id_nivel 
    FROM formacoes_professores fp 
    JOIN formacoes f ON f.id = fp.id_formacao 
    GROUP BY id_nivel 
) t2 on t2.id_nivel = t1.id