Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde! Será que alguém poderia me ajudar com a seguinte dificuldade, eu 5 tabelas:
Tabela voluntarios, composta pelos campos id_voluntario(chave primária), nome, sobrenome;
Tabela habilidades, composta pelos campos id_habilidade(chave primária), nome;
Tabela voluntarios_habilidades, composta pelos campos id_hab_voluntarios(chave primária), voluntario_id(fk para a pk da tabela voluntarios) e habilidades_id(fk para a pk da tabela habilidades);
Tabela treinamentos, composta pelos campos id_treinamento(chave primária), nome;
Tabela voluntarios_treinamentos composta peloas campos id_trein_realizado(chave primária), voluntario_id(fk para a pk da tabela voluntarios) e treinamentos_id(fk para a pk da tabela treinamentos);
Eu vou precisar criar filtros como voluntários que tenham x, y, z habilidades e voluntários que tenham a, b, c treinamentos. Tentei criar uma view usando INNER JOIN conforme consulta abaixo:
SELECT voluntarios.id_voluntario, voluntarios.nome, habilidades_voluntario.habilidades_id,
habilidades.nome AS 'habilidade_nome', treinamentos_realizados.treinamentos_id, treinamentos.nome AS 'treinamento_nome'
FROM voluntarios
INNER JOIN habilidades_voluntario ON voluntarios.id_voluntario=habilidades_voluntario.voluntario_id
INNER JOIN habilidades ON habilidades_voluntario.habilidades_id=habilidades.id_habilidade
INNER JOIN treinamentos_realizados ON voluntarios.id_voluntario=treinamentos_realizados.voluntario_id
INNER JOIN treinamentos ON treinamentos_realizados.treinamentos_id=treinamentos.id_treinamento;
Porém está consulta só está junto a tabelas se o voluntário tiver uma habilidade e um treinamento, se tiver uma habilidade e nenhum treinamento e vice versa, não está sendo incluso no join. Esta está sendo a minha dificuldade. Será que alguém sabe o que estou fazendo de errado ou uma mneira melhor de se fazer isto?
Eu tentei usar o left e o right join, mas ainda sim não consegui, isto resolveu parte do problema. Ao passo que com INNER JOIN só estava sendo incluso voluntários que tenham uma habilidade e um treinamento, com o left join estava pegando voluntarios que tivessem pelo menos uma habilidade, podendo ter ou não um treinamento. No meu caso eu preciso exibir os voluntários mesmo que eles não tenham nenhuma habilidade e nenhum treinamento.
Substitui todos os INNER JOIN por LEFT JOIN, fazendo isso, mesmo que o voluntário não possua nenhuma habilidade ou treinamento, a tabela voluntários retornará por completo, mas os campos das tabelas relacionadas retornarão NULL caso não encontre o relacionamento entre as tabelas, ou retornará o valor correspondente.
Espero que entendam minha explicação...
Use outer join, como left ou rigth.