Duvida Estrutural DEA / SQL - PHP

The Dealer

Power Member
Simplificando ao máximo: tenho vários alunos cada um com várias disciplinas, e estou aqui a pensar, qual a melhor forma de estruturar as coisas? Tabela Alunos e Disciplinas ou Alunos, AlunosDisciplinas e Disciplinas? É que penso que tem de ser mesmo esta ultima hipotese (devido a umas decisoes que tomei que nao vale a pena referir), mas como nunca usei, como fazer?

Por exemplo se tiver um campo Numero em Alunos e um campo Id em Disciplinas, meto como campos da AlunosDisciplinas os anterior referidos como chave estrangeiros? Mas meto como auto increment? Ou tenho de copiar para essa mesmo tabela o id e o numero cada vez que faço um insert na tabela Alunos e Disciplinas?

Elucidação agradece-se :)

Cumprimentos a todos.
 
Última edição:
Simplificando ao máximo: tenho vários alunos cada um com várias disciplinas, e estou aqui a pensar, qual a melhor forma de estruturar as coisas? Tabela Alunos e Disciplinas ou Alunos, AlunosDisciplinas e Disciplinas? É que penso que tem de ser mesmo esta ultima hipotese (devido a umas decisoes que tomei que nao vale a pena referir), mas como nunca usei, como fazer?

Por exemplo se tiver um campo Numero em Alunos e um campo Id em Disciplinas, meto como campos da AlunosDisciplinas os anterior referidos como chave estrangeiros? Mas meto como auto increment? Ou tenho de copiar para essa mesmo tabela o id e o numero cada vez que faço um insert na tabela Alunos e Disciplinas?

Elucidação agradece-se :)

Cumprimentos a todos.

Se queres criar a a tabela alunosdisciplina podes fazer de duas formas:

dois campos (alunos e disciplinas) e trabalhas com chave composta;

3 campos (id, alunos, disciplinas) e colocas o primeiro como primary key auto_increment.

Como acabaste por fazer na questão das notas?
 
O teu raciocínio está correcto, em relações "Muitos para Muitos" (1 aluno tem várias disciplinas, e 1 disciplina é constituiada por vários alunos) tem de existir uma tabela de associação, neste caso a "AlunosDisciplinas".

Não podes usar campos AutoIncrement em chaves estrangeiras, o valor deve ser o mesmo da chave primária, ou seja, tens de "copiar" o valor do campo numero e id, das tabelas "Alunos" e "Disciplinas" respectivamente.

Exemplo:

[Alunos]
numero; nome
1001; Ana
1002; João


[Disciplinas]
id; nome
1; Português
2; Inglês;
3; Francês;

[AlunosDisciplinas]
chave_aluno; chave_disciplina
1001; 1
1001; 2
1002; 1
1002; 3


Neste caso:
A Ana frequenta as disciplinas de Português e Inglês
O João frequenta as disciplinas de Português e Francês


Espero ter ajudado ;)
 
3 campos (id, alunos, disciplinas) e colocas o primeiro como primary key auto_increment.
Mas assim, cada vez que inserir um aluno ou disciplina não terei também que correr um query para fazer insert em alunos e disciplinas?

Como acabaste por fazer na questão das notas?
Depois de ter desenhado no papel o que pretendo concretamente fazer, decidi deixar essa questão para ultimo (até porque algumas sugesões apresentadas envolvem ficheiros xml etc), mas em principio irei permitir ao professor que quando crie a disciplina (já fiz o respectivo menu dinamico), decida os momentos de avaliação que a mesma terá.
 
Última edição:
O teu raciocínio está correcto, em relações "Muitos para Muitos" (1 aluno tem várias disciplinas, e 1 disciplina é constituiada por vários alunos) tem de existir uma tabela de associação, neste caso a "AlunosDisciplinas".

Não podes usar campos AutoIncrement em chaves estrangeiras, o valor deve ser o mesmo da chave primária, ou seja, tens de "copiar" o valor do campo numero e id, das tabelas "Alunos" e "Disciplinas" respectivamente.

Exemplo:

[Alunos]
numero; nome
1001; Ana
1002; João


[Disciplinas]
id; nome
1; Português
2; Inglês;
3; Francês;

[AlunosDisciplinas]
chave_aluno; chave_disciplina
1001; 1
1001; 2
1002; 1
1002; 3


Neste caso:
A Ana frequenta as disciplinas de Português e Inglês
O João frequenta as disciplinas de Português e Francês


Espero ter ajudado ;)

Pois, bem me parecia que então teria de andar sempre com query's suplementares para fazer as cópias :P
 
Estou aqui à já algum tempo sem perceber porque é que o meu query não funciona, e a tentar faze-lo por funcionar por tentativa e erro, mas sem sucesso :(

Estou a tentar o seguinte:

PHP:
$query = "INSERT INTO AlunosDisciplinas(ID_Aluno,ID_Disciplina)
                                    SELECT DISTINCT Numero
                                    FROM Alunos
                                    AND AlunosDisciplinas.ID_Disciplina = ".$nome;

ID_Disciplina é um varchar e se fizer echo $nome exactamente atrás, dependendo da página da disciplina em que estou dá-me o nome da cadeira.

Basicamente o que quero fazer é encher o campo do lado esquerdo com os numeros dos alunos que entraram "da ultima vez" via upload .csv, e o segundo campo enche-lo com o nome da disciplina que passo por $nome. Só que (eu sei) estou a usar o AND mal. Há ali qualquer coisa que não está bem..

Será que me poderiam ajudar?
 
Essa query está um bocado marada :D

1. Estás a fazer um SELECT da tabela Alunos com uma condição usa um campo da tabela AlunosDisciplinas

2. O teu INSERT tem 2 campos e no SELECT só tens 1, o nº tem de ser igual

além disso, não estou a perceber o teu raciocinio, quem vê a query assim de repente parece que estas a querer "encher" a tabela AlunosDisciplinas com dados da tabela Alunos e da propria tabela AlunosDisciplinas, o que não faz muito sentido

Penso que o quererás fazer é mais algo do tipo:

PHP:
$query = "INSERT INTO AlunosDisciplinas(ID_Aluno,ID_Disciplina)
                                    SELECT DISTINCT Numero, Disciplinas.ID_Disciplina
                                    FROM Alunos, Disciplinas
                                    AND Disciplinas.ID_Disciplina = ".$nome;
Não sei se é bem isto que queres. Lembra-te de testar sempre em base de dados de testes ou faz backup da actual :D
 
Essa query está um bocado marada :D

1. Estás a fazer um SELECT da tabela Alunos com uma condição usa um campo da tabela AlunosDisciplinas

2. O teu INSERT tem 2 campos e no SELECT só tens 1, o nº tem de ser igual

além disso, não estou a perceber o teu raciocinio, quem vê a query assim de repente parece que estas a querer "encher" a tabela AlunosDisciplinas com dados da tabela Alunos e da propria tabela AlunosDisciplinas, o que não faz muito sentido

Penso que o quererás fazer é mais algo do tipo:

PHP:
$query = "INSERT INTO AlunosDisciplinas(ID_Aluno,ID_Disciplina)
                                    SELECT DISTINCT Numero, Disciplinas.ID_Disciplina
                                    FROM Alunos, Disciplinas
                                    AND Disciplinas.ID_Disciplina = ".$nome;
Não sei se é bem isto que queres. Lembra-te de testar sempre em base de dados de testes ou faz backup da actual :D

Pois eu sei que está :P

Umas minis e uns tremoços a ver o jogo do Sporting-Benfica conduziram-me à solução (e já não vou falar do facto que o Sporting foi roubado à força toda, se não o off-topic já nem acaba hoje) :)
 
Última edição:
Já agora,

Se eu fizer isto no phpMyAdmin:
Código:
SELECT Alunos.Numero, Alunos.Nome, Alunos.Apelido, AlunosDisciplinas.ID_Disciplina, Disciplinas.tipo FROM Alunos, AlunosDisciplinas, Disciplinas
                    WHERE Alunos.Numero = AlunosDisciplinas.ID_Aluno
                    AND Disciplinas.tipo = 'D'
                    AND AlunosDisciplinas.ID_Disciplina=".$nome
(em vez de ".$nome tenho 'Sistemas Operativos', para testar). E dá-me um resultado do género:

Numero Nome Apelido ID_Disciplina tipo 12458 ADOLFO BARDOSA AMARAL PEIXINHO Sistemas Operativos D
Até aqui tudo bem, mas quando faço o query no PHP como deve ser (com o $nome), ele não devolve nada e dá-me mysql_fetch_array(): supplied argument is not a valid MySQL result resource. Aquele $nome foi uma variavel que mais em cima pus a guardar o nome da disciplina dependendo do menu em que está, tanto que se fizer echo $nome logo a seguir aquele código, dá "Sistemas Operativos" (está correcto portanto).... Devia funcionar, mas não funciona!

E agora?
 
Última edição:
Fiz $nome="Sistemas Operativos"; antes desse query mas nem assim! Mas no phpMyAdmin dá com = 'Sistemas Operativos' ou mesmo se puser no php assim também dá.

???? Terei alguma coisa mal no que vem a seguir?

PHP:
        $resultado = mysql_query($sql,$connectDB);
    
            while($registo = mysql_fetch_array($resultado))
                {
                $numero = $registo['Numero'];
                $apelido = $registo['Apelido'];
                $nome = $registo['Nome'];
        
                print("<tr><td>$numero</td><td>$nome $apelido</td></tr>");
EDIT: acrescentei um or die mysqlerror() e diz-me
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Operativos' at line 4
Testei para disciplinas com uma só palavra 'Compiladores', e diz-me Unknown column 'Compiladores' in 'where clause' !!!

Mas no phpMyAdmin tudo funciona perfeitamente.. (como quem diz no php = 'Compiladores ou 'Sistemas Operativos' ou seja o que for) Será que alguem me consegue ajudar?
 
Última edição:
O problema é que a não estás a colocar a variavel $nome entre plicas ('), se fizeres um echo da variavel $sql vai-te mostrar algo tipo


SELECT Alunos.Numero, Alunos.Nome, Alunos.Apelido, AlunosDisciplinas.ID_Disciplina, Disciplinas.tipo FROM Alunos, AlunosDisciplinas, Disciplinas
WHERE Alunos.Numero = AlunosDisciplinas.ID_Aluno
AND Disciplinas.tipo = 'D'
AND AlunosDisciplinas.ID_Disciplina=Sistemas Operativos

Se colares isto no phpmyadmin tb te vai dar erro porque "Sistemas Operativos" tem de estar entre plicas:

...AND AlunosDisciplinas.ID_Disciplina='Sistemas Operativos'

Ou seja tens de colocar o sql assim:

...AND AlunosDisciplinas.ID_Disciplina=' ".$nome." ' "
 
O problema é que a não estás a colocar a variavel $nome entre plicas ('), se fizeres um echo da variavel $sql vai-te mostrar algo tipo


SELECT Alunos.Numero, Alunos.Nome, Alunos.Apelido, AlunosDisciplinas.ID_Disciplina, Disciplinas.tipo FROM Alunos, AlunosDisciplinas, Disciplinas
WHERE Alunos.Numero = AlunosDisciplinas.ID_Aluno
AND Disciplinas.tipo = 'D'
AND AlunosDisciplinas.ID_Disciplina=Sistemas Operativos

Se colares isto no phpmyadmin tb te vai dar erro porque "Sistemas Operativos" tem de estar entre plicas:

...AND AlunosDisciplinas.ID_Disciplina='Sistemas Operativos'

Ou seja tens de colocar o sql assim:

...AND AlunosDisciplinas.ID_Disciplina=' ".$nome." ' "

Pois eu também sabia que o problema era aí, mas como experimentei de tantas maneiras diferentes e deu-me parse error tive mm de vir aqui perguntar :)
 
Back
Topo