GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Não consigo fazer query com Count e inner join


#1
Tenho estas tabelas.

Tabela Usuarios: 
id 
nome, 
outras colunas que não interferem

Tabela revisor_tecnico: 
idprofessor
idatividadeacademica
outras colunas que não interferem

Tabela Atividade Acadêmica: 
id 
descrição 
outras colunas que não interferem

Tabela Questões:
id
idRevisor 
outras colunas que não interferem

Preciso Pegar todos o Nomes dos usuários que são revisores, nome da sua Atividade acadêmica e contar quantas questões estão vinculadas a ele.

Só consegui chegar até aqui:

select U.nome as nome, AA.descricao as Disciplina from usuarios U 

INNER JOIN revisores_tecnicos as RT ON RT.idProfessor = U.id
INNER JOIN atividadeacademica_professor as AP on AP.idAtividadeAcademica = RT.idAtividadeAcademica
INNER JOIN atividadeacademica as AA on AA.id = AP.idAtividadeAcademica
INNER JOIN questoes as Q on Q.idRevisor;

Alguém me da uma luz?


#2

Sempre que usar funções como COUNT, MAX, MIN, AVG, SUM, etc, vc precisa usar agrupamento, no seu caso, após os inner join:

GROUP BY U.nome, AA.descricao

E lá no SELECT…

select U.nome as nome, AA.descricao as Disciplina, COUNT(Q.id) AS questoes from...

Aliás, pelo que vc postou, faltou vincular as questoes ao usuario que a digitou, pq parou no Q.idRevisor?


#3

cortei o resto do código sem querer quando copiei e colei. vou tentar fazer oque você falou.


#4
select U.nome as nome, AA.descricao as Disciplina, COUNT(Q.id) as QTD from usuarios U 
INNER JOIN revisores_tecnicos as RT ON RT.idProfessor =  U.id 
INNER JOIN atividadeacademica_professor as AP on AP.idAtividadeAcademica = RT.idAtividadeAcademica  
INNER JOIN atividadeacademica as AA on AA.id = AP.idAtividadeAcademica 
INNER JOIN questoes as Q on Q.idRevisor = U.id GROUP BY U.nome, AA.descricao;

Fiz assim, consegui contar. mas alguma coisa está errado. pois a contagem está errada.
O usuário de id 19 tem 31 questões e na minha query ficou com QTD = 93.


#5

Agora foi. era um join que não precisava. kkk

select U.nome as nome, AA.descricao as Disciplina, COUNT(Q.id) from usuarios U INNER JOIN revisores_tecnicos as RT ON RT.idProfessor = U.id INNER JOIN atividadeacademica as AA on AA.id = RT.idAtividadeAcademica INNER JOIN questoes as Q on Q.idRevisor = U.id and Q.idAtividadeAcademica = RT.idAtividadeAcademica GROUP BY U.nome, AA.descricao

Muito obrigado mano.


#6

Como eu poderia fazer outro count mas com questões com situação igual a 3, Q.situacao = 3 e depois subtrair do valor de count QTD?


#7

Ai teria que usar case:

...COUNT(Q.id), COUNT(CASE Q.situacao WHEN 3 THEN 1 ELSE 0 END) FROM...

Ou if:

...COUNT(Q.id), COUNT(IF(Q.situacao = 3, 1, 0)) FROM...

E pra ter a diferença algo nesse sentido:

...COUNT(Q.id), COUNT(Q.id) - COUNT(IF(Q.situacao = 3, 1, 0)) FROM...

Vai brincando, é assim que se aprende


#8

vlw, vou tentar fazer.