Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ronaldo Neves

SELECT em 3 tabelas retornando em apenas uma lina

Recommended Posts

Bom dia, estou começando no MySQL e estou tendo dificuldade pra fazer uma consulta, não sei ao certo como usar o INNER JOIN ou LEFT JOIN.

A situação é a seguinte

Possuo 3 tabelas

FUNCIONARIO

 

id | nome | email | funcao

1 | teste | |

 

SECAO

 

id | secao

1 | acidente de transito

2 | vistoria

 

SECAO_FUNCIONARIO

 

id | funcionario_id | secao_id

1 | 1 | 1

2 | 1 | 2

 

Gostaria de saber como seria o SELECT que me retornaria as informações do funcionário e em quais seções ele está cadastrado, retornando o nome da seção

 

o retorno seria assim

 

id_funcionario | nome_funcionario | nome_secao

 

consegui fazer a consulta, só que o retorno vem em várias linhas, de acordo com a quantidade de seções que o funcionário estiver cadastrado.

 

Segue a imagem da consulta e o resultado retornado, gostaria que o resultado ficasse em apenas uma linha e não sei como fazer

select.jpg

 

Na imagem aparecem outras consultas, mas o problema está entre fazer o relacionamento entre a tabela funcionario, secao e secao_funcionario.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos ver..

 

A resposta q vc quer seria assim?

 

id_funcionario | nome_funcionario | nome_secao

1 teste acidente de transito

1 teste vistoria

 

se a ideia é esta, basta vc utilizar:

 

SELECT B.id, B.nome, C.secao

FROM secao_funcionario A

INNER JOIN funcionario B ON (A.funcionario_id = B.id)

INNER JOIN secao C ON( A.secao_id = C.id)

 

acho q é isso.

 

Agora se a tabela de resposta for algo diferente, então descreva ela que tento ajudar de outra maneira.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa, realmente não deixei muito claro como seria a resposa, gostaria que fosse assim (só podem ter 3 seções)

 

id_funcionario | nome_funcionario | nome_secao | nome_secao2 | nome_secao 3

1 | teste | acidente de transito | vistoria |

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom vamos lá.

Vou fazer o que você quer funcionar, mas pelo fato de você ter apenas 3 seções no máximo, e isso ser fixo, não vejo a necessidade entao de você ter uma tabela de mapeamento chamado secoes_funcionarios

Neste caso seria mais correto você ter id_secao1 id_secao2 e id_secao3 na própria tabela funcionarios

Uma tabela de mapeamente serve quando você tem N valores, o que nao é seu caso pois está limitado em 3

Não seria correto limitar em 3 pelo fato de que hoje tem somente 3 e quando entrar o 4 você modifica o código.

 

Bom, mas vamos ao que você quer

 

SELECT

A.id,

A.nome,

MAX(IF(C.id = 1, C.secao, NULL)) AS nome_secao1,

MAX(IF(C.id = 2, C.secao, NULL)) AS nome_secao2,

MAX(IF(C.id = 3, C.secao, NULL)) AS nome_secao3

FROM funcionario A

INNER JOIN secao_funcionario B ON (A.id = B.funcionario_id )

INNER JOIN secao C ON( B.secao_id = C.id)

GROUP BY A.id

 

Note q para esse método funcionar, você terá q ter sempre q ter as ids de seção como 1,2 e 3

 

Na minha opinião isto está errado e fará com que a consulta fique mais lenta.

 

 

Eu acharia melhor você pensar em utilizar a função GROUP_CONCAT do MYSQL onde você poderá ter o resultado em apenas uma coluna com os valores separados por virgula. Depois você utiliza um explode no php para transformar a coluna em um array.

 

 

ficaria assim

 

SELECT

A.id,

A.nome,

GROUP_CONCAT(C.secao)

FROM funcionario A

INNER JOIN secao_funcionario B ON (A.id = B.funcionario_id )

INNER JOIN secao C ON( B.secao_id = C.id)

GROUP BY A.id

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim.

Esse ultimo código seria para n seções

ele resultaria em uma coluna com os resultados separados por virgula.

 

a coluna ficaria assim

 

secao

acidente de transito,vistoria,protocolo,juridico,....

 

seja quantos for por padrao separará por ,

se por acaso você for usar virgula no nome do setor, vc pode utilizar outro separador ou ordenação ou outras funções.

Por exemplo selecionando para o grupo os diferentes da tabela secao_funcionarios em ordem da id da tabela secao separados por arroba(@)

então substituiria aquele GROUP_CONCAT por esso

 

GROUP_CONCAT(DISTINCT B.secao_id ORDER BY C.id ASC SEPARATOR '@')

 

Bom poder ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazendo outros cadastros de funcionários identifiquei que o SELECT retorna apenas um funcionário com todas as seções, o que precisa ser feito para que liste todos os funcionários cadastrados com suas respectivas seções?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.