Problemas com Inner Join no SQL

09/04/2015

e ai pessoal,

minha duvida é o seguinte, eu tenho 2 tabelas tabelaa: codigoa(chave primaria), time(varchar) tabelab: codigob(chave primaria), timecasa(chave estrangeira), timevisitante(chave estrangeira), placarcasa(int),placarvisitante(int).

então timecasa e timevisitante fica relacionado (são chaves estrangeiras) a chave primaria codigo da tabela A, ai quanto eu coloco para fazer o inner join e me mostra os cadastro certo.


SELECT tebelaa.codigoa,tebelaa.time, tabelab.timecasa, tabelab.placarcasa,
tabelab.placarvisitante, tabelab.timevisitante, tebelaa.time, tebelaa.codigoa
FROM tebelaa INNER JOIN tabelab ON tebelaa.codigoa=tabelab.timevisitante



então não vai porque eu quero que ele me mostre o nome do time que é o campo time do banco, mais quando eu coloco este inner join ele me mostra do nome certo com codigo dele?

como é um confronto um time X joga contra vários times, mais o banco não aceita eu cadastrar ele varias vez contra outro time ja cadastrados, como resolvo isso?

então são esta duas perguntas:

resolver como mostrar inner join com 2 chaves estrangeiras de uma tabela ligado na primaria da outra tabela? como é um confronto um time X joga contra vários times, mais o banco não aceita eu cadastrar ele varias vez contra outro time ja cadastrados, como resolvo isso?

Estou usando o WampServer 1.6.1.33

Imagem a baixo demostra o que estou falando
[img:descricao=aqui mostra a primeira tabela com todos os campos cadstrados]http://arquivo.devmedia.com.br/forum/imagem/423816-20150409-182404.png[/img]
[img:descricao=Aqui mostra 2 tabela com todos os campos cadastrado e chamando a chave estrangeira e não consigo cadastrar mais de uma fez o mesmo time na chave estrangeira]http://arquivo.devmedia.com.br/forum/imagem/423816-20150409-182519.png[/img]
[img:descricao=Problema: a coluna codigoa e time da esquerda espelha a da direita e isso não pode, o certo era que a da esquerda chame os time do seus codigoa certo e da direita mesma coisa chame os certos]http://arquivo.devmedia.com.br/forum/imagem/423816-20150409-182651.png[/img]

Fernando Fred

Melhor resposta

09/04/2015

Respondendo a sua primeira pergunta, vocÊ pode fazer JOIN de 2 chaves estrangeiras da seguinte forma (O raciocínio é o contrário do que você projetou):

SELECT tebelaa_casa.codigoa,tebelaa_casa.time, tabelab.timecasa, tabelab.placarcasa,
tabelab.placarvisitante, tabelab.timevisitante, tebelaa_visitante.time, tebelaa_visitante.codigoa
FROM tabelab INNER JOIN tebelaa_visitante ON tebelaa_visitante.codigoa=tabelab.timevisitante
INNER JOIN tebelaa_casa ON tebelaa_casa.codigoa=tabelab.timecasa



A sua segunda pergunta não entendi muito bem. Em que tabela você não consegue inserir o mesmo time ? Dê exemplos com operações de SQL.

Ronaldo Lanhellas

Responder Citar

Outras Respostas

09/04/2015

Ronaldo Lanhellas

Respondendo a sua primeira pergunta, vocÊ pode fazer JOIN de 2 chaves estrangeiras da seguinte forma (O raciocínio é o contrário do que você projetou):

SELECT tebelaa_casa.codigoa,tebelaa_casa.time, tabelab.timecasa, tabelab.placarcasa,
tabelab.placarvisitante, tabelab.timevisitante, tebelaa_visitante.time, tebelaa_visitante.codigoa
FROM tabelab INNER JOIN tebelaa_visitante ON tebelaa_visitante.codigoa=tabelab.timevisitante
INNER JOIN tebelaa_casa ON tebelaa_casa.codigoa=tabelab.timecasa



A sua segunda pergunta não entendi muito bem. Em que tabela você não consegue inserir o mesmo time ? Dê exemplos com operações de SQL.
Responder Citar

09/04/2015

Fernando Fred

Hum então você adicionou mais uma tabela chamado tebelaa_visitante ou não?
então tem 3 tabelas certo?
com 2 inner join certo deste jeito eu nunca fiz

em relação a 2 pergunta eu já resolvi obrigado pela preocupação e por me ajudar

é que o seguinte estou fazendo um programa para web que faz confronto entre times por isso que preciso deste inner join funcionando, ai meu outro problema que irei cria outro fórum sera sobre cadastrar combobox e textfild do php para ir no banco e depois mostrar na outro pagina o resultado usando este inner join. que pegara os placares e no dos time para mostrar os confrontos entre eles.

Obrigado de novo Ronaldo Lanhellas
Responder Citar

09/04/2015

Ronaldo Lanhellas

Não criei nenhuma nova tabela, apenas um alias para a tabela_visitante e outro para tabela_casa
Responder Citar

09/04/2015

Ronaldo Lanhellas

Não criei nenhuma nova tabela, apenas um alias para a tabela_visitante e outro para tabela_casa
Responder Citar

10/04/2015

Fernando Fred

mais não deu e fala que não existe esta tabela no banco
o que eu faço
Responder Citar

11/04/2015

Marcos P

Fernando,

Crie suas tabelas no Fiddle, insira alguns registros de teste e depois avise, para que possamos simular suas consultas por lá !

Suas definições não ficaram muito claras e, do jeito que está, teremos dificuldades em lhe auxiliar.

Vou acompanhar esse post.

Fico no aguardo...
Responder Citar

13/04/2015

Fernando Fred

Fernando, Crie suas tabelas no Fiddle, insira alguns registros de teste e depois avise, para que possamos simular suas consultas por lá ! Suas definições não ficaram muito claras e, do jeito que está, teremos dificuldades em lhe auxiliar. Vou acompanhar esse post. Fico no aguardo...

eu nunca usei este Fiddle
não sei como usar
Responder Citar

13/04/2015

Marcos P

É muito fácil....

Na janela da esquerda crie a estrutura das tabelas.

Depois de criada as tabelas, insira os registros de exemplo na janela da direita !

Veja um exemplo de um material que preparei lá... Exemplo Fiddle

Abra uma nova janela e tente !
Responder Citar

13/04/2015

Fernando Fred

É muito fácil.... Na janela da esquerda crie a estrutura das tabelas. Depois de criada as tabelas, insira os registros de exemplo na janela da direita ! Veja um exemplo de um material que preparei lá... Exemplo Fiddle Abra uma nova janela e tente !

ok entendi olha que é fácil mesmo em bom aqui esta o link da minha duvida [url]http://sqlfiddle.com/#!9/fad5c/1/0[/url]

na 2 coluna que a é do time tem que estar relacionado ao timecasa igual esta na 5 coluna que tambem é de time onde esta certinho o time com o time visitante

e este é o que o Ronaldo estava me ajudando [url]http://sqlfiddle.com/#!9/fad5c/2[/url]

e agora como faço? como resolvo este problema
Responder Citar

13/04/2015

Marcos P

" na 2 coluna que a é do time tem que estar relacionado ao timecasa igual esta na 5 coluna que tambem é de time onde esta certinho o time com o time visitante"...

Que frase, hein ?!?

A coluna 2 é "time" e a coluna 5 é "timevisitante"... é isso ?

O relacionamento que está feito é : tabelaa.codigoa=tabelab.timevisitante... ou seja, o time da "tabelaa" é o time visitante na "tabelab".

Agora, você precisa fazer o relacionamento de tabelaa.codigoa=tabelab.codigob ?

Na mesma query ?

Em caso, positivo... que sentido tem isso se já ocorreu o relacionamento da tabelaa.codigoa=tabelab.timevisitante ?
Responder Citar

13/04/2015

Marcos P

Veja, lá... se isso resolve seu problema

SELECT a.codigoa, a.time, 
       b.timecasa, b.placarcasa, b.placarvisitante, b.timevisitante, b.codigob
FROM tebelaa a INNER JOIN tabelab b ON a.codigoa=b.timevisitante
UNION ALL
SELECT a.codigoa, a.time, 
       b.timecasa, b.placarcasa, b.placarvisitante, b.timevisitante,b.codigob
FROM tebelaa a INNER JOIN tabelab b ON a.codigoa=b.codigob
Responder Citar

13/04/2015

Fernando Fred

" na 2 coluna que a é do time tem que estar relacionado ao timecasa igual esta na 5 coluna que tambem é de time onde esta certinho o time com o time visitante"... Que frase, hein ?!? A coluna 2 é "time" e a coluna 5 é "timevisitante"... é isso ? O relacionamento que está feito é : tabelaa.codigoa=tabelab.timevisitante... ou seja, o time da "tabelaa" é o time visitante na "tabelab". Agora, você precisa fazer o relacionamento de tabelaa.codigoa=tabelab.codigob ? Na mesma query ? Em caso, positivo... que sentido tem isso se já ocorreu o relacionamento da tabelaa.codigoa=tabelab.timevisitante ?


Me desculpe eu errei a coluna é a 7 que é coluna do time que relaciona com timevisitante
Responder Citar

13/04/2015

Marcos P

Testou o que eu postei ?

Tenho mais 15 minutos aqui... testa lá !
Responder Citar

13/04/2015

Fernando Fred

Veja, lá... se isso resolve seu problema
SELECT a.codigoa, a.time, 
       b.timecasa, b.placarcasa, b.placarvisitante, b.timevisitante, b.codigob
FROM tebelaa a INNER JOIN tabelab b ON a.codigoa=b.timevisitante
UNION ALL
SELECT a.codigoa, a.time, 
       b.timecasa, b.placarcasa, b.placarvisitante, b.timevisitante,b.codigob
FROM tebelaa a INNER JOIN tabelab b ON a.codigoa=b.codigob


Deixa eu tentar explica melhor Marcos P

timecasa e timevisitante são chaves estrangeiras da chave primaria do codigoa que recebe o nome dos times

quando eu cadastro timecasa e timevisitante esta tudo certo relacionando ao time, so que quando ele vai mostrar no inner join não mostra, para eu saber se esta tudo certo eu cadastrei os time com os nome dos id do campo codigoa, exemplo: codigoa 1 é igual a time A1 e por ai vai.

Então é isso que eu quero, irei mostra um exemplo com imagem para mostrar como eu quero
[img]http://arquivo.devmedia.com.br/forum/imagem/423816-20150413-194528.jpg[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/423816-20150413-194628.jpg[/img]

é isso
Responder Citar

14/04/2015

Marcos P

E aí ?

Funcionou ?
Responder Citar