Ir ao conteúdo
  • Cadastre-se

MySQL criar nova tabela com a junção de 2 existentes


Posts recomendados

Bom dia Galera não to conseguindo nem por nada fazer isto, tenho 2 tabelas com a seguinte estrutura

 


--
-- Estrutura da tabela `jogos`
--

CREATE TABLE `jogos` (
  `id` int(11) NOT NULL,
  `time1` varchar(60) NOT NULL,
  `placar1` int(11) NOT NULL,
  `placar2` int(11) NOT NULL,
  `time2` varchar(60) NOT NULL,
  `rodada` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `jogos`
--

INSERT INTO `jogos` (`id`, `time1`, `placar1`, `placar2`, `time2`, `rodada`) VALUES
(5, 'time1', 0, 0, 'time6', 1),
(9, 'time2', 34, 32, 'time7', 1),
(5, 'time3', 0, 0, 'time8', 1),
(5, 'time4', 0, 0, 'time9', 1),
(5, 'timr5', 0, 0, 'time10', 1);

e a outra assim:

--
-- Estrutura da tabela `tb_campeonato`
--

CREATE TABLE `tb_campeonato` (
  `id` int(11) NOT NULL,
  `time` varchar(60) NOT NULL,
  `img` text NOT NULL,
  `jogos` int(11) NOT NULL,
  `vitoria` int(11) NOT NULL,
  `empate` int(11) NOT NULL,
  `derrota` int(11) NOT NULL,
  `Gols Pro` int(11) NOT NULL,
  `Gols Sofridos` int(11) NOT NULL,
  `saldo de gol` int(11) NOT NULL,
  `pontos` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `tb_campeonato`
--

INSERT INTO `tb_campeonato` (`id`, `time`, `img`, `jogos`, `vitoria`, `empate`, `derrota`, `Gols Pro`, `Gols Sofridos`, `saldo de gol`, `pontos`) VALUES
(1, 'EngFOA', 'engfoa.png', 0, 0, 0, 0, 0, 0, 0, 0),
(2, 'Uff Vila', 'vila.img', 0, 0, 0, 0, 0, 0, 0, 0),
(4, 'USS', 'uss.img', 0, 0, 0, 0, 0, 0, 0, 0),
(3, 'MedFoa', 'medfoa.img', 0, 0, 0, 0, 0, 0, 0, 0),
(5, 'Edf Foa', 'edf.img', 0, 0, 0, 0, 0, 0, 0, 0),
(6, 'UBM', 'ubm.png', 0, 0, 0, 0, 0, 0, 0, 0),
(7, 'UGB', 'ugb.png', 0, 0, 0, 0, 0, 0, 0, 0),
(8, 'Fer', 'fer.png', 0, 0, 0, 0, 0, 0, 0, 0),
(9, 'Uff aterrado', 'aterrado.png', 0, 0, 0, 0, 0, 0, 0, 0),
(10, 'Odonto Foa', 'odonto.png', 0, 0, 0, 0, 0, 0, 0, 0);

E quando eu quero mostrar pros usuarios os jogos eu apenas mostro a tabela jogos com um mysqli_fletch_assoc, de acordo com a rodada do campeonato, porém eu estava precisando da imagem de cada time que esta na tb_campeonato, como posso pegar? tentei com um inner join, mas nao tive sucesso

Link para o comentário
Compartilhar em outros sites

Bom dia @Augusto Telles

 

Olhando para a estrutura das tabelas, houve provavelmente um equivoco na hora da modelagem das mesma, perceba que as tabelas jogos e tb_campeonato, são N para N, ou seja os times participam de muitos jogos e os jogos tem muitas equipes.

 

O certo a ser feito era ter criado uma tabela intermediaria que contivesse o id das duas tabelas e o placar daquele time naquele jogo.

 

Para "resolver" o seu problema, sem refazer as tabelas, você pode fazer 3 selects e usar ou não um union, que irá te um alto custo de processamento, ou você pode dar um duplo left join usando alias na tabela tb_campeonato.

 

Essas duas soluções são gambiarras, o certo realmente seria você resolver essas estruturas das tabelas.

Link para o comentário
Compartilhar em outros sites

agora que vi que mandei os dados da tb_campeonato errado, por isso acredito que você comentou sobre uma terceira tabela, o correto e isto:

CREATE TABLE `tb_campeonato` (
  `id` int(11) NOT NULL,
  `time` varchar(60) NOT NULL,
  `img` text NOT NULL,
  `jogos` int(11) NOT NULL,
  `vitoria` int(11) NOT NULL,
  `empate` int(11) NOT NULL,
  `derrota` int(11) NOT NULL,
  `Gols Pro` int(11) NOT NULL,
  `Gols Sofridos` int(11) NOT NULL,
  `saldo de gol` int(11) NOT NULL,
  `pontos` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `tb_campeonato` (`id`, `time`, `img`, `jogos`, `vitoria`, `empate`, `derrota`, `Gols Pro`, `Gols Sofridos`, `saldo de gol`, `pontos`) VALUES
(1, 'time1', 'engfoa.png', 0, 0, 0, 0, 0, 0, 0, 0),
(2, 'time2', 'vila.img', 0, 0, 0, 0, 0, 0, 0, 0),
(4, 'time3', 'uss.img', 0, 0, 0, 0, 0, 0, 0, 0),
(3, 'time4', 'medfoa.img', 0, 0, 0, 0, 0, 0, 0, 0),
(5, 'time5', 'edf.img', 0, 0, 0, 0, 0, 0, 0, 0),
(6, 'time6', 'ubm.png', 0, 0, 0, 0, 0, 0, 0, 0),
(7, 'time7', 'ugb.png', 0, 0, 0, 0, 0, 0, 0, 0),
(8, 'time8', 'fer.png', 0, 0, 0, 0, 0, 0, 0, 0),
(9, 'time9', 'aterrado.png', 0, 0, 0, 0, 0, 0, 0, 0),
(10, 'time10', 'odonto.png', 0, 0, 0, 0, 0, 0, 0, 0);

CREATE TABLE `jogos` (
  `id` int(11) NOT NULL,
  `time1` varchar(60) NOT NULL,
  `placar1` int(11) NOT NULL,
  `placar2` int(11) NOT NULL,
  `time2` varchar(60) NOT NULL,
  `rodada` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



INSERT INTO `jogos` (`id`, `time1`, `placar1`, `placar2`, `time2`, `rodada`) VALUES
(5, 'time1', 0, 0, 'time6', 1),
(9, 'time2', 34, 32, 'time7', 1),
(5, 'time3', 0, 0, 'time8', 1),
(5, 'time4', 0, 0, 'time9', 1),
(5, 'timr5', 0, 0, 'time10', 1);

veja com fiddlecomo fica quando uso o inner join (select*from jogos inner join tb_campeonato on tb_campeonato.time=jogos.time1 or jogos.time2=tb_campeonato.time) porém como mostra a imagem do resultado, apesar de mostrar a imagem do time1 e do time2 ele repete as 5 linhas do time1 para mostrar as 5 do time2 sendo que eu queria apenas que ele mostrasse as 5 linhas de jogos sem se repetir criando uma coluna img1(img do time1) e img2 (img do time2), se nao tiver sido clado em algo e so falar!image.thumb.png.f19147c91b74f20556eb2c73c1d5fa07.png

Link para o comentário
Compartilhar em outros sites

Como eu disse, suas tabelas são muitos para muitos ou N para N, realmente seria necessário a criação de uma terceira tabela.

 

Dá uma lida no tutorial desse LINK, que eu já tinha te passado, sem saber sobre cardinalidade, fica difícil explicar o por que a as suas tabelas estão erradas. 

Link para o comentário
Compartilhar em outros sites

10 minutos atrás, Augusto Telles disse:

Li aqui, mas continuo sem entender o objetivo

 

Então vamos lá, qual é cardinalidade das suas tabelas e por que?

 
 
10 minutos atrás, Augusto Telles disse:

uma vez que só preciso pegar os dados da tabela jogos e as imagens da tabela tb_campeonato de acordo com o time que é um dado comum em ambas

 

Justamente o que estou tentando lhe mostrar é porque você está tendo tanta dificuldade em realizar algo relativamente simples, no caso a culpa é da construção da sua estrutura de tabelas e a da não normalização das mesmas. Mas para conseguir ver isso, você tem que entender esses conceitos primeiros. Afinal você não vai querer construir as coisas fazendo gambiarra, né? ;) 

Link para o comentário
Compartilhar em outros sites

Tenta esquecer um pouco os joins e se concentra em arrumar a estrutura.

 

Ou seja em UM jogo você tem MUITOS times. (Sim, qual quer coisa maior que 1 é muitos.)

 

UM time joga MUITOS jogos.

 

Logo você tem duas tabelas com o relacionamento muitos para muitos (N para N).

 

E o que você faz quando tem uma tabela N:N?

 

 

Link para o comentário
Compartilhar em outros sites

Realmente, não é impossível fazer isso, porém você realmente quer ter uma estrutura mal planejada? Com um select cheio de gambiarras? Você realmente deseja construir um banco de dados mal otimizado?

 

Imagine você construir um banco de dados com 20 tabelas e todo select que você tiver que fazer for uma gambiarra. Quando você for perceber seus selects já estão demorando mais de 30 minutos para retornar algumas informações.

 

Vale mais a pena você entender o que está fazendo de errado, aprender o certo e aplicar para os próximos bancos que você fizer, do que simplesmente """resolver""" o seu problema atual e virar um bola de neve futuramente.

 

 

Link para o comentário
Compartilhar em outros sites

A questão é, você tem que ir passo a passo, entender o básico para depois chegar em seu objetivo.

 

Esqueça um pouco seu objetivo final e tente ir por passo, se você atropelar os passos realmente ficará confuso.

 

Então vamos voltar, você tem duas tabelas, jogo e time, que são N:N, então você deve criar uma tabela de relacionamento fraco ou tabela intermediaria.

 

jogo 1:N jogo_time N:1 time

 

jogo_time será sua tabela intermediaria. Nela terá, a chave primaria de jogo e a chave primaria de time, ou seja terá duas chaves estrangeiras, Alem disso ela conterá também a quantidade de "gols" feitos naquela partida por aquele time, pois essa informação pertence ao time e ao jogo ao mesmo tempo.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!