Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) JOIN com duas FK da mesma PK


João Paulo Ricardo

Pergunta

Boa tarde pessoal,
Tenho uma tabela de usuário e uma de chamado.
Na de usuário tenho o id (PK) e o nome.
Na de chamado, tenho o atendente(FK) e o responsável(FK). Esses dois campos não chave estrangeira do id do usuário.
Dúvida:
Como fazer uma junção para trazer o nome do usuário para os dois campos?
Obs: Atendente e responsável, podem ser usuários diferentes.
Abraços
João Paulo
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Já tentou assim...?

SELECT * FROM chamado, usuario as atendente, usuario as responsavel WHERE chamado.id_atendente = atendente.id and chamado.id_responsavel = responsavel.id

Espero ter ajudado

Editado por Markus Magnus
Link para o comentário
Compartilhar em outros sites

  • 0

Não, porque repare que na clausula FROM eu chamo a tabela usuario duas vezes e como o MySQL vai diferenciar uma da outra? Através dos "apelidos" que eu dei a cada uma (atendente e responsavel), logo quando eu vou chama-las na clausula WHERE eu cito os "apelidos", para que o MySQL entenda com qual eu estou trabalhando de cada vez.

Usando do jeito que eu escrevi aparece algum erro?

Tem como você dar um Exportar nas tabelas e colar aqui pra que eu saiba realmente o nome de cada campo?

PS.: Os campos id_atendente, atendente.id, id_responsavel e responsavel.id devem ser trocados pelos nomes reais de cada campo só usei esses nomes para exemplificar o SELECT.

Link para o comentário
Compartilhar em outros sites

  • 0

Tente assim:

SELECT * FROM chamado c
INNER JOIN usuario a ON c.idatendente = a.idusuario
INNER JOIN usuario r ON c.idresponsavel = r.idusuario
onde c.idatendente e c.idresponsavel são os nomes que eu dei para os respectivos atributos em chamado (já que não sei os nomes corretos e tinha que mostrar um exemplo)
Link para o comentário
Compartilhar em outros sites

  • 0

O "as" entre a tabela e os "apelidos" é opcional?

Sim. O AS entre o nome da tabela e seu apelido é opcional.

Qual é a diferença entre usar apenas a cláusula FROM e usar os JOINS?

Quando se trata de INNER JOIN não há diferença na execução. Apenas muito mais didático. Lembre-se Hoje você faz e amanhã outro dará manutenção.

Verifique que a cláusula ON é a condicional entre as duas ligações. Qualquer outro comparativo deverá ficar na cláusula WHERE. Da forma como você escreve se houver uma cláusula WHERE com muitos elementos poderá haver erro e não será fácil encontrá-lo.

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi, você poderia me explicar qual é a vantagem e de repente casos que seja realmente necessário o uso de LEFT e RIGHT JOIN?

Permita-me uma brincadeira, você deve voltar aos tempos do primeiro ano do segundo grau, onde se fala de relações entre conjuntos.

ehehehe.

No exemplo abaixo:

SELECT descricaotipopagamento, nomecartao, valor, valortaxacartao from caixa cx
INNER JOIN tipopagamento tp ON tp.idTipoPagamento = cx.idTipoPagamento
LEFT JOIN cartaocredito cr ON cr.idCartao = cx.idCartao
WHERE dataevento > '2013-12-31'
Verifique que estou listando todo o movimento de caixa de 2014 até agora;

Pode haver tipos de pagamento que não são cartões de crédito. Quando isto acontecer os dados da tabela cartaocredito virão NULO

No caso de tipopagamento sempre haverá uma resposta. Por isso o uso de INNER.

INNER é Intercessão de conjuntos. Só traz os elementos resultantes que aparecem nos dois conjuntos. Se existir em um conjunto e não existir no outro ele não traz nada.

LEFT trará TODOS os elementos do conjunto a esquerda e somente os elementos do conjunto a direita quando eles existirem.

Link para o comentário
Compartilhar em outros sites

  • 0

Agora eu entendi.

Nuss agora eu tenho um monte de SELECTs dentro de SELECTs, para fazer a mesma coisa que o LEFT JOIN, para alterar ahuahua.

O RIGHT JOIN é a mesma coisa que o LEFT JOIN só que inverte a posição das tabelas retorna TODOS os registros da direita e os da esquerda só quando existirem, certo?

É bem estranho pensar em fazer uma consulta onde a tabela que eu quero todos os registros no JOIN e a tabela com informações adicionais no FROM.

Obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

Deu certo Denis,

Apenas coloquei um apelido para poder saber qual campo usuarioNome se referia ao responsável e o atendente.

Ficou assim:

SELECT *, a.usuarioNome as atendente, r.usuarioNome as responsavel FROM chamado
INNER JOIN usuario a ON chamadoAtendente = a.usuarioid
INNER JOIN usuario r ON chamadoResponsavel = r.usuarioid
Obrigado Denis e Markus.
Abraços
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...