Ir para conteúdo

POWERED BY:

Arquivado

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

duquesimba

[Resolvido] Inner Join

Recommended Posts

Não sei onde estou errando e nem mesmo se estou fazendo certo, precisando de uma ajuda com essa consulta em Mysql.

Tenho 2 tabelas ALUNO (id e nome) e

CURSO (cod, aluno1, aluno2, aluno3, aluno4 e aluno5) onde aluno1, aluno2, etc contem a id de cada aluno

 

Fazia a consulta pelo cod do CURSO depois um while para buscar o nome do aluno pela id

 

Isso acabou sobrecarregando o servidor pois acontecia de quando listava 20 cursos por exemplo ele fazia 100 consultas ao banco.

 

Tente usar o INNER JOIN mais não sei onde estou errando:

 

SELECT * FROM curso

INNER JOIN aluno a ON curso.aluno1 = a.id

INNER JOIN aluno b ON curso.aluno2 = b.id

WHERE curso.cod = $codigocurso

 

Desde já agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

CURSO (cod, aluno1, aluno2, aluno3, aluno4 e aluno5) onde aluno1, aluno2, etc contem a id de cada aluno

não entendi essa estrutura.

se puder explicar melhor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

CURSO (cod, aluno1, aluno2, aluno3, aluno4 e aluno5) onde aluno1, aluno2, etc contem a id de cada aluno

não entendi essa estrutura.

se puder explicar melhor...

 

 

Na tabela curso fica gravado exemplo: 15 - 123 - 124 - 125 - 201 - 205

onde o 15 seria o codigo do curso e os demais as matriculas (id) do alunos, quero buscar o nome dos alunos através da matricula (id) na tabela ALUNO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua modelagem esta errada, não esta normalizada e também não entendi direito, mas vê se é isso:

 

CREATE TABLE aluno (
matricula   INTEGER NOT NULL,
nome        VARCHAR(80),
CONSTRAINT matricula_pkey PRIMARY KEY (matricula)
);

CREATE TABLE curso (
cod_curso    INTEGER NOT NULL,
matricula    INTEGER NOT NULL,
CONSTRAINT cod_curso_pkey PRIMARY KEY (cod_curso),
CONSTRAINT matricula_fkey FOREIGN KEY (matricula) REFERENCES aluno (matricula)
);

 

SELECT curso.cod_curso, aluno.matricula, aluno.nome
FROM aluno INNER JOIN curso ON (aluno.matricula = curso.matricula);

 

- E lembre-se, o número certo de JOINs vai ser sempre N-1 onde N = número de tabelas. A não ser que a consulta seja recursiva, que não é o caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou ser mais explicativo

 

Tabelas:

ALUNO

1 - João

2 - Maria

3 - Eduardo

4 - Rodrigo

5 - Danile

segue (hoje vai até 125)

 

CURSO (id, aluno1, aluno2, aluno3, aluno4, aluno5)

1 - 3 - 2 - 15 - 19 - 17

5 - 3 - 100 - 80 - 2 - 14

1 - 18 - 19 - 25 - 4 - 10

 

Na tabela CURSO salvo o id da DISCIPLINA e mais o id de 5 alunos (quantidade máxima de alunos por curso) veja que pode repetir várias vezes o id

 

A tabela DISCIPLINA tem essa estrutura:

 

DISCIPLINA

1 - Dança

2 - Jiu-Jitsu

3 - Dança do Ventre

4 - Karatê

5 - Artesanato

6 - Teatro

 

Então faço uma consulta que quando eu escolher a disciplina vai retornar todas as Turmas daquele CURSO com 5 alunos o que me retornaria algo do tipo:

 

Exemplo escolho opção 1

 

Obtenho o resultado do Nome do Curso e as 5 ids do alunos

Dança - 3 - 2 - 15 - 19 - 17

Dança - 18 - 19 - 25 - 4 - 10

 

Daqui fazia um while para pesquisar o nome de cada aluno o que resultaria em 5 consultas por linha no exemplo 10 consultas.

 

Quero saber se tenho como ao escolher a opção exemplo "1" retornar o resultado da consulta a tabela CURSO já com os nomes:

 

Dança - nome aluno1 - nome aluno2 - nome aluno3 - nome aluno4 - nome aluno5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá galera, estou vendo que ainda há um problema de normalização com o seu código.

 

Vamos pensar de uma forma mais completa, de uma olhada nesta imagen:

 

Picture%202.png

 

Aqui você tem, 4 tabelas: Alunos, cursos, inscrições e turmas, onde na tabela de inscrições você concentra os id's das outras três tabelas.

Desta forma será muito mais fácil trabalhar. Vejamos um exemplo:

 

Selecionar os alunos que fazem o curso de gastronomia (pois estou com fome :D )

 

SELECT 
#dados dos alunos
alu.matricula, alu.nome,alu.telefone,

#dados da inscrição
ins.created AS inscrito,

#dados do curso
cur.nome AS curso,

#dados da turma
tur.nome AS turma,tor.sala,tur.horario

FROM inscricoes AS ins
INNER JOIN alunos AS alu ON alu.id = ins.aluno_id
INNER JOIN cursos AS cur ON cur.id = ins.curso_id
INNER JOIN turmas AS tur ON tur.id = ins.turma_id
WHERE cur.id = 1

#supondo que 1 é o id do curso de gastronomia

 

O resultado creio que seria:

matricula----nome----telefone-----inscrito------curso--------turma----sala----horario

001---------will------66666666--10/01/1011--gastronomia---01------01-----12:00

 

 

Bom não testei nada disto ai, mas foi desta forma que ganhei 9 no trabalho da facu :clap:

 

Dúvidas poste ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

William sua solução funciona mais ai eu teria uma outra tabela para fazer o relacionamento. Assim seria mais fácil eu ao invés de ter uma tabela CURSO com uma id e 5 alunos, ter somente um aluno.

 

CURSO

ID - matricula

1 - 15

1 - 18

1 - 25

1 - 36

1 - 48

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sinceramente eu não entendi sua colocação. Desta forma que você se expressou, esta errado uma tabela com id's repetidos, no exemplo que eu te dei em nenhum momento isto acontece.

 

E cuidado as vezes você procura o mais fácil e acaba esquecendo as regras de normalização e seus relacionamentos :D

 

OBS: a tabela turma eu coloque somente para exemplificar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William acho que não estou conseguindo me expressar realmente, estou totalmente enrolado com esse JOIN, acho que vou voltar para o While e deixar fazer quantas consultas forem necessárias.

 

De uma olhada como faço hoje:

$sql = "SELECT * FROM CURSO where curso=$id";
$result = mysql_query($sql, $conecta);

$consulta = mysql_fetch_array($result);


if ($consulta[aluno1]<>0){

$i = 0;
$aluno = $consulta[0];


while ($i <= 3) {

$i++;
$sql1 = "SELECT id, nome FROM ALUNO where id=$aluno";
$consult = mysql_query($sql1, $conecta);
$row = mysql_fetch_array($consult);

switch($i) {

case "1":
break;
case "2":
break;
case "3":
break;
case "4":
break;
}

$aluno =$consulta[$i];

}
}

 

Vamos ver se explico melhor o que preciso

 

Salvo em uma tabela chamada CURSO 6 colunas: id, aluno1, aluno2, aluno3,aluno4, aluno5 , onde id e a id do curso e mais a matricula de 5 alunos que é o máximo que o curso permite.

 

em outra tabela chamada ALUNO tenho a matricula e nome do aluno.

 

Faço a consulta pelo CURSO neste ponto posso achar mais de um com o seguinte retorno:

 

id|aluno1|aluno2|aluno3|aluno4|aluno5

1|15|16|17|18|19

1|35|36|37|38|39

 

O que preciso é retornar com o nome do aluno e não com as matriculas.

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então desculpa, mas esta forma que você esta fazendo esta errado: id, aluno1, aluno2, aluno3,aluno4, aluno5

Por isto que você mesmo nos contou que deu problema de sobrecarga no seu sistema.

 

Faça isto da forma que eu fiz com aquela tabela chamada inscrições. Acho que pelo fato de você precisar de um limite de 5 inscrições por curso você esta criando 5 colunas, mas a idéia não tem que ser esta.

 

De uma Stop nesta forma que esta fazendo e de um re-play, reeeeeestruturando suas tabelas.

Se quiser uma ajuda. e se não tiver problemas em compartilhar seu trabalho, com o forum. Começe nos contando quais são suas tabelas, e objetivo do sistema. Creio que é até melhor assim outros podem opinar e teremos um sistema mais robusto. :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

William antes de mais nada obrigado por sua ajuda e interesse em ajudar.

 

Esquece meu último post pois não tenho duas vezes o id = 1 no curso.

 

Na verdade faço uma consulta pelo id do curso na tabela CURSO (esta tabela não é o nome do curso e sim somente o id do curso e os 5 alunos deste curso) exemplo id = 1 e me retorna:

id|aluno1|aluno2|aluno3|aluno4|aluno5

1|5|16|17|18|19

 

depois faço o while buscando cada resultado (5, 16, 17, 18, 19) que são as matriculas do alunos na tabela ALUNOS para pegar o nome.

 

Então acabo fazendo 6 consultas = 1 para buscar o curso e as matriculas dos 5 alunos e depois mais 5 consultas para buscar o nome de cada aluno.

 

A pergunta é posso acabar com estas outras 5 consultas que buscam o nome dos alunos?

 

Já peguei isso pronto no site quando assumi e estou querendo reestruturar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim pode, você irá somente utilizar um coluna para o id do aluno.

Como esta naquela minha tabela chamada incrições. Na verdade esta tabela que você se refere ao curso é esta tabela inscrições, se você fizer desta forma que estou dizendo, com apenas uma consulta irá trazer todos os alunos do curso xpto.

 

Aproveite que você esta restruturando e faça de uma forma bacana ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado William e a demais membros do forum

consegui resolver minha consulta sem ter que mexer no meu banco de dados:

 

tabela CURSO

id|aluno1|aluno2|aluno3|aluno4|aluno5

 

tabela ALUNOS

id|nome

 

como ficou a consulta:

 

SELECT c.*,  a1.nome AS aluno1, a2.nome AS aluno2, a3.nome AS aluno3, a4.nome AS aluno4 FROM curso AS c  
INNER JOIN alunos AS a1 ON e.aluno1 = a1.id   
INNER JOIN alunos AS a2 ON e.aluno2 = a2.id 
INNER JOIN alunos AS a3 ON e.aluno3 = a3.id 
INNER JOIN alunos AS a4 ON e.aluno4 = a4.id 
INNER JOIN alunos AS a5 ON e.aluno5 = a5.id 
WHERE c.id = $ids

Esta funcionando como preciso.

Agradeço a todos que colaboraram me ajudando.

Abraços

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.