Ir para conteúdo

POWERED BY:

Arquivado

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

Lorena_rio

Left Join

Recommended Posts

Olá amiguinhos, estou precisando de uma ajudinha em um select. Tenho que chamar duas tabelas mas não estou conseguindo, talvez pela complexidade de meu código.

 

Tenho um sistema de boletim para escolas. Ele faz a associação das matérias com as séries, e o professor se loga também pela matéria e pela série. Até aí tudo bem. Mas quando cadastro os períodos ele é comum a todos. Por exemplo: Eu tenho uma série que vai ter somente 4 períodos e outra com 6 períodos, mas quando entro ele sempre vai aparecer o número total de períodos que o sistema tem. Então se tenho 6 períodos cadastrados e vou ter uma série de 4 períodos, quando logar ele vai mostrar os 6 períodos.

 

E outro ponto é nas matérias, pois também tem período que preciso ter uma matéria em um período e no outro período não, porém quando se loga ele aparece todos as matérias.

 

Bom. agora como está no Mysql.

 

Então eu queria no mínimo fazer um LEFT JOIN ou INNER JOIN, mas só leiga nesse assunto, a associação eu até já fiz no banco e quando faço a associação pelo sistema ele associa no banco de dados direitinho, mas como fazer para aparecer mesmo eu não sei

 

No mínimo queria fazer que determinados períodos não vão estar associados a algumas matérias.

 

Acho que as tabelas chaves seria a PERIODOS e a PERIODO_MATERIA

 

Segue o banco.

 

--
-- Banco de Dados: `escola`
--
-- --------------------------------------------------------
--
-- Estrutura da tabela `administracao`
--
CREATE TABLE IF NOT EXISTS `administracao` (
`id_adm` int(10) NOT NULL auto_increment,
`nome` varchar(150) NOT NULL,
`email` varchar(150) NOT NULL,
`login` varchar(30) NOT NULL,
`senha` varchar(20) NOT NULL,
`data` varchar(20) NOT NULL,
PRIMARY KEY (`id_adm`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
--
-- Extraindo dados da tabela `administracao`
--
INSERT INTO `administracao` (`id_adm`, `nome`, `email`, `login`, `senha`, `data`) VALUES
(1, 'Lorena', 'lorena_ls23@hotmail.com.br', 'admin', 'admin', '29/07/2013 - 18:37');
-- --------------------------------------------------------
--
-- Estrutura da tabela `alunos`
--
CREATE TABLE IF NOT EXISTS `alunos` (
`id_aluno` int(10) NOT NULL auto_increment,
`aluno` varchar(150) NOT NULL,
`foto` varchar(255) NOT NULL,
`email` varchar(150) NOT NULL,
`endereco` varchar(150) NOT NULL,
`numero` varchar(30) NOT NULL,
`complemento` varchar(150) NOT NULL,
`bairro` varchar(150) NOT NULL,
`cep` varchar(30) NOT NULL,
`cidade` varchar(150) NOT NULL,
`estado` varchar(30) NOT NULL,
`telefone` varchar(30) NOT NULL,
`celular` varchar(30) NOT NULL,
`pai` varchar(150) NOT NULL,
`mae` varchar(150) NOT NULL,
`sexo` varchar(30) NOT NULL,
`nascimento` varchar(30) NOT NULL,
`cpf` varchar(30) NOT NULL,
`matricula` varchar(30) NOT NULL,
`id_serie` varchar(30) NOT NULL,
`login` varchar(30) NOT NULL,
`senha` varchar(30) NOT NULL,
`obs` varchar(150) NOT NULL,
`mensagem` varchar(1000) NOT NULL,
`ativo` int(1) NOT NULL,
PRIMARY KEY (`id_aluno`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
--
-- Extraindo dados da tabela `alunos`
--
INSERT INTO `alunos` (`id_aluno`, `aluno`, `foto`, `email`, `endereco`, `numero`, `complemento`, `bairro`, `cep`, `cidade`, `estado`, `telefone`, `celular`, `pai`, `mae`, `sexo`, `nascimento`, `cpf`, `matricula`, `id_serie`, `login`, `senha`, `obs`, `mensagem`, `ativo`) VALUES
(2, 'JOANA COSTA MACHADO', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '10001', '3', 'aluno', '123456', '', '', 1);
-- --------------------------------------------------------
--
-- Estrutura da tabela `materias`
--
CREATE TABLE IF NOT EXISTS `materias` (
`id_materia` int(10) NOT NULL auto_increment,
`materia` varchar(255) NOT NULL,
PRIMARY KEY (`id_materia`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;
--
-- Extraindo dados da tabela `materias`
--
INSERT INTO `materias` (`id_materia`, `materia`) VALUES
(11, 'MATEMÁTICA'),
(12, 'FÍSICA'),
(13, 'INGLÊS'),
(14, 'GEOGRAFIA'),
(15, 'LITERATURA'),
(16, 'HISTÓRIA'),
(17, 'PORTUGUÊS'),
(18, 'QUÍMICA');
-- --------------------------------------------------------
--
-- Estrutura da tabela `notas`
--
CREATE TABLE IF NOT EXISTS `notas` (
`id_aluno` int(10) NOT NULL,
`id_serie` int(10) NOT NULL,
`id_materia` int(10) NOT NULL,
`id_periodo` int(10) NOT NULL,
`nota` decimal(4,2) NOT NULL,
`faltas` int(2) NOT NULL,
`datas_falta` text NOT NULL,
`obs` text NOT NULL,
`seg` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela `notas`
--
INSERT INTO `notas` (`id_aluno`, `id_serie`, `id_materia`, `id_periodo`, `nota`, `faltas`, `datas_falta`, `obs`, `seg`) VALUES
(2, 3, 11, 9, 6.00, 0, '', '', '.'),
(2, 3, 11, 10, 8.00, 0, '', '', '.'),
(2, 3, 11, 11, 5.00, 0, '', '', '.'),
(2, 3, 11, 12, 7.00, 0, '', '', '.');
-- --------------------------------------------------------
--
-- Estrutura da tabela `periodos`
--
CREATE TABLE IF NOT EXISTS `periodos` (
`id_periodo` int(10) NOT NULL auto_increment,
`periodo` varchar(255) NOT NULL,
PRIMARY KEY (`id_periodo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
--
-- Extraindo dados da tabela `periodos`
--
INSERT INTO `periodos` (`id_periodo`, `periodo`) VALUES
(9, '1º; BIMESTRE'),
(10, '2º; BIMESTRE'),
(11, '3º; BIMESTRE'),
(12, '4º; BIMESTRE');
-- --------------------------------------------------------
--
-- Estrutura da tabela `periodo_materia`
--
CREATE TABLE IF NOT EXISTS `periodo_materia` (
`id_periodo` int(10) NOT NULL,
`id_materia` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Estrutura da tabela `periodo_serie`
--
CREATE TABLE IF NOT EXISTS `periodo_serie` (
`id_periodo` int(10) NOT NULL,
`id_serie` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela `periodo_serie`
--
INSERT INTO `periodo_serie` (`id_periodo`, `id_serie`) VALUES
(10, 3),
(9, 3),
(11, 3),
(12, 3),
(9, 4),
(10, 4);
-- --------------------------------------------------------
--
-- Estrutura da tabela `professores`
--
CREATE TABLE IF NOT EXISTS `professores` (
`id_professor` int(10) NOT NULL auto_increment,
`professor` varchar(150) NOT NULL,
`email` varchar(150) NOT NULL,
`telefone` varchar(30) NOT NULL,
`login` varchar(30) NOT NULL,
`senha` varchar(20) NOT NULL,
PRIMARY KEY (`id_professor`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
--
-- Extraindo dados da tabela `professores`
--
INSERT INTO `professores` (`id_professor`, `professor`, `email`, `telefone`, `login`, `senha`) VALUES
(3, 'LORENA SIMEONE', '', '', 'lorena', '123456');
-- --------------------------------------------------------
--
-- Estrutura da tabela `professor_materia`
--
CREATE TABLE IF NOT EXISTS `professor_materia` (
`id_professor` int(10) NOT NULL,
`id_materia` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela `professor_materia`
--
INSERT INTO `professor_materia` (`id_professor`, `id_materia`) VALUES
(3, 12),
(3, 14),
(3, 16),
(3, 13),
(3, 15),
(3, 11),
(3, 17),
(3, 18);
-- --------------------------------------------------------
--
-- Estrutura da tabela `professor_serie`
--
CREATE TABLE IF NOT EXISTS `professor_serie` (
`id_professor` int(10) NOT NULL,
`id_serie` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela `professor_serie`
--
INSERT INTO `professor_serie` (`id_professor`, `id_serie`) VALUES
(3, 3),
(3, 4);
-- --------------------------------------------------------
--
-- Estrutura da tabela `series`
--
CREATE TABLE IF NOT EXISTS `series` (
`id_serie` int(10) NOT NULL auto_increment,
`serie` varchar(255) NOT NULL,
PRIMARY KEY (`id_serie`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
--
-- Extraindo dados da tabela `series`
--
INSERT INTO `series` (`id_serie`, `serie`) VALUES
(3, 'PRIMEIRA SÉRIE DO ENSINO MÉDIO - TURMA A'),
(4, 'SEGUNDA SÉRIE DO ENSINO MÉDIO - TURMA B');
-- --------------------------------------------------------
--
-- Estrutura da tabela `serie_materia`
--
CREATE TABLE IF NOT EXISTS `serie_materia` (
`id_serie` int(10) NOT NULL,
`id_materia` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela `serie_materia`
--
INSERT INTO `serie_materia` (`id_serie`, `id_materia`) VALUES
(3, 11),
(3, 12),
(3, 13),
(3, 14),
(3, 15),
(3, 16),
(3, 17),
(3, 18),
(4, 12),
(4, 14),
(4, 16),
(4, 15),
(4, 11),
(4, 17),
(4, 18);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Fabio. Então, apenas mostrei no sql que as associações aí estão feitas, mas quero fazer um LEFT JOIN das matérias com os períodos.

 

Então no caso seria a tabela PERIODOS com a tabela PERIODO_MATERIA. Ele já associa automaticamente as matérias a todos os períodos. Mas queria que a matéria matemática por exemplo ficasse em 4 períodos, e a matéria física somente em dois períodos.

 

Pois tem certos períodos que determinada matéria não tem, e no caso ele aparece todas as matérias em todos os períodos, eu queria esse LEFT JOIN para poder no PHP separar isso, já que no SQL já está ok

 

Deu para entender? Rsrs

 

Só para simplificar. Ele está assim no meu php

 

<? $sql_periodo = mysql_query("SELECT * FROM periodos");
while ($col_periodo = mysql_fetch_array($sql_periodo)) { ?><tr>
<td><?=$col_periodo[periodo]?></td>
Então lista todos os períodos, eu queria que ele nesse LEFT JOIN mostrasse somente os períodos que contenha as matérias

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais claro..rsrs

Vamos la na Tabela periodo_materias vc terias o cadastro da materia e qual periodo ela foi cadastrada correto?

 

supondo isso usarias as tabelas periodos, periodo_materias e materias.

 

SELECT 
P.id_periodo,P.periodo,
PM.id_periodo,PM.id_materia,
M.id_materia,M.materia
FROM 
periodos as P,
periodo_materia as PM,
materias as M
WHERE
PM.id_periodo = P.id_periodo AND
PM.id_materia = M.id_materia

Compartilhar este post


Link para o post
Compartilhar em outros sites

De acordo que eu vou associando ele vai aparecendo períodos, mas se eu associar matemática a dois períodos e física a dois períodos, ele duplica, 1º período duas vezes e 2º período duas vezes. Será que nesse caso deveria associar também a série??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Te add no skype, aí te passo o banco de dados e o arquivo php, acho que fica mais fácil

 

 

Fabioooooooooo Help...... Te mandei uma mensagem pelo skype, aquela parte ficou certinha, mas não consigo associar a série. Quando Coloco uma série que vai ter dois períodos, mas uma matéria que vai ter 2 períodos, predomina o número máximo que é dos períodos, assim mesmo eu ditando que aquela série vai ter 2 períodos ele aparece com 4 períodos de matemática por exemplo. Mas não posso colocar a matemática com 2 períodos também, pois ela vai estar em alguma série que vai ter mais períodos.

 

 

 

Naquele banco de dados associa certinho, pelo php é que não consegui inserir junto com a mudança que vc fez.

 

Se puder me ajudar mais nessa te agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o erro é por conta do LEFT JOIN.

 

o left join faz uma junção das tabelas da seguinte forma:

 

Se alguns desses pontos(on tabela1.campo = tabela2.campo and tabela1.campo2 = tabela2.campo2) me retorna true então você junta TUDO.

 

no seu caso teria que ser o INNER JOIN e então o sistema sabe que você só quer cruzar as tabelas quando TODAS as condições forem verdadeiras tanto de campo e campo 2.

 

entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Vinicius, mas o Select que o Fabio me passou funcionou direitinho no que se referia a matéria com o período, só que depois eu teria de fazer uma associação também com a série, e nesse caso o sistema não fazia essa associação de série, matéria e período.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele fez a mesma coisa só que sem usar as palavras reservadas JOIN ou LEFT JOIN ou INNER JOIN.

 

eu só estou fazendo um adendo por que eles são de difícil compreensão mesmo e as vezes é o conceito que nos complica e não a query em si.

vou mostrar a query dele escrita com JOIN.

 

 

SELECT 
P.id_periodo,P.periodo,
PM.id_periodo,PM.id_materia,
M.id_materia,M.materia
FROM 
periodos as P
INNER JOIN periodo_materia as PM ON PM.id_periodo = P.id_periodo
INNER JOIN materias as M ON PM.id_materia = M.id_materia

 

o seu tópico ficou um pouco grande, tem como me passar só as chaves das tabelas aqui em baixo separadas? assim eu terei uma visão melhor das coisas

Compartilhar este post


Link para o post
Compartilhar em outros sites

joins.jpg

 

LEFT JOIN

 

Vamos exibir todos os dados da tabela `Funcionarios` mesmo que os dados da tabela `Filial` não satisfaçam os registros da tabela esquerda.

 

RIGHT JOIN

 

Somente exibiremos os dados da tabela `Funcionários` se o valor da tabela da Direita (`Filial`) satisfazer o valor da tabela da esquerda (`Funcionarios`).

 

INNER JOIN

 

Exibe os resultados das duas tabelas... Sendo que uma depende da outra para satisfazer a consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltou o FULL JOIN, mas o MySql parece não suportar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Refiz tudo amiguinhos, pq eu tinha de criar uma associação aonde teria de informar que na SÉRIA A teria de ter tantos períodos, e que a MATÉRIA X só estaria nos PERÍODOS Y.

 

Então ficou assim, criei essas tabelas

 

Tabela UNIOES, aonde vou criar o id para cada separação dessas uniões

 

--
-- Estrutura da tabela `unioes`
--
CREATE TABLE IF NOT EXISTS `unioes` (
`id_uniao` int(10) NOT NULL auto_increment,
`uniao` varchar(150) NOT NULL,
PRIMARY KEY (`id_uniao`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Tabelas já existentes para se fazer essas novas
--
-- Estrutura da tabela `series`
--
CREATE TABLE IF NOT EXISTS `series` (
`id_serie` int(10) NOT NULL auto_increment,
`serie` varchar(255) NOT NULL,
PRIMARY KEY (`id_materia`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Estrutura da tabela `materias`
--
CREATE TABLE IF NOT EXISTS `materias` (
`id_materia` int(10) NOT NULL auto_increment,
`materia` varchar(255) NOT NULL,
PRIMARY KEY (`id_materia`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Estrutura da tabela `periodos`
--
CREATE TABLE IF NOT EXISTS `periodos` (
`id_periodo` int(10) NOT NULL auto_increment,
`periodo` varchar(255) NOT NULL,
PRIMARY KEY (`id_materia`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT= ;
E outras 3 tabelas que seriam os relacionamentos.
--
-- Estrutura da tabela `serie_uniao`
--
CREATE TABLE IF NOT EXISTS `serie_uniao` (
`id_serie` int(10) NOT NULL,
`id_uniao` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Estrutura da tabela `materia_uniao`
--
CREATE TABLE IF NOT EXISTS `materia_uniao` (
`id_materia` int(10) NOT NULL,
`id_uniao` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Estrutura da tabela `periodo_uniao`
--
CREATE TABLE IF NOT EXISTS `periodo_uniao` (
`id_periodo` int(10) NOT NULL,
`id_uniao` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Na verdade agora eu queria fazer o relacionamento dessas últimas 3 tabelas.
serie_uniao, materia_uniao e periodo_uniao. Alguém me da uma luz. Essa parte é meu fraco ainda.
Já fiz a página que insiro tudo certo nas tabelas, mas não estou conseguindo fazer o relacionamento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade vou ter que agora criar uma nova tabela e uma página de inserção de dados. No caso agora tenho de criar uma tabela sendo serie_periodo_materia

 

 

Alguém da uma luz de como eu consigo isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É projeto de curso superior? Cursinho de alguma linguagem de programação?

Como assim "é meu fraco"? Qual parte exatamente, de codificação ou de select?

 

A maneira mais simples de entender o funcionamento das junções é por teoria de conjuntos.

 

Leitura recomendada:

http://dan-scientia.blogspot.com.br/2012/10/teoria-dos-conjuntos-em-juncoes-sql.html

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.