Ir para conteúdo

POWERED BY:

Arquivado

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

Luan Ramos

consulta com resultado indesejado

Recommended Posts

Boa tarde pessoal,

 

Estou desenvolvendo um sistema de provas onde o aluno entra no sistema e lista as provas que estão cadastradas para a turma dele. Porém o meu chefe quer que as provas que ele já fez não apareçam na lista.

 

Eu fiz o seguinte:

 

Criei uma tabela "sis_resp_prova" onde eu gravo o codigo da prova feita e o cpf do aluno que realizou, além de outras informações que não são relevantes a este caso.

 

e quando o aluno vai listar as provas que estão disponiveis pra ele fiz a consulta da seguinte forma:

 

mysql_select_db($database_DB_Connect, $DB_Connect);
$query_prova = sprintf("SELECT * FROM sis_prova, sis_resp_prova, sis_aluno WHERE sis_aluno.cpf = ".$cpf." AND sis_resp_prova.cod_prova1 != sis_prova.cod_prova AND sis_prova.curso =".$colname_prova);
$prova = mysql_query($query_prova, $DB_Connect) or die(mysql_error());
$row_prova = mysql_fetch_assoc($prova);
$totalRows_prova = mysql_num_rows($prova);

 

Ou seja, a meu ver o que eu estou fazendo é, selecione a prova em que o código da mesma for diferente do codigo da prova respondida, enquando o CPF for igual ao do aluno.

 

OBS: CPF é puxado através de uma SESSION.

 

Quando eu entro no sistema e realizo a prova, ela desaparece para o meu CPF, porém, quando eu entro com outro CPF ela não aparece como se este outro COF já estivesse feito também.

 

Gostaria da ajuada de vocês.

 

Agradeço desde já.

 

Abraços!



sendo que sis_prova é a tabela que contém a prova cadastrada e sis_aluno é de onde eu puxo o CPF.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok :

 

1) Quais os relacionamentos de

sis_prova, sis_resp_prova, sis_aluno ?

O filtro por CPF já deveria garantir as provas dos alunos.

 

2) Por

 

o meu chefe quer que as provas que ele já fez não apareçam na lista

 

tinha entendido que mesmo as provas do aluno não seriam visíveis se ele já as tivesse feito.Aí caberia um NOT IN ou NOT EXISTS, ou até mais simples uma simples condição de sis_prova

Compartilhar este post


Link para o post
Compartilhar em outros sites

As tabelas não possuem relacionamentos.

 

 

tinha entendido que mesmo as provas do aluno não seriam visíveis se ele já as tivesse feito.Aí caberia um NOT IN ou NOT EXISTS, ou até mais simples uma simples condição de sis_prova

 

É isso mesmo. As provas que o aluno já fez não podem aparecer novamente pra ele. Porém não sei trabalhar com NOT IN ou NOT EXISTIS. Devo estar errando a lógica da consulta, mas não estou conseguindo enxergar isso. Gostaria de uma consulta simples como estou tentando fazer, entende?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

As tabelas não tem relação ? Não precisa ser relacionamento do tipo FK.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que acontece é o seguinte:

 

a tabela sis_aluno é:

Nome

CPF

Turma

 

a tabela sis_prova é:

cod_prova
turma

professor

disciplina

 

a tabela sis_resp_prova é:

cpf (do aluno que realizou a prova)

aluno (nome do aluno que realizou a prova)

cod_prova1 (codigo da prova que o aluno realizou)

turma (Turma do aluno que realizou a prova)

professor (o mesmo da tabela sis_prova, que é o professor que passou a prova)

disciplina (a mesma da tabela sis_prova, disciplina da prova)

 

o que acontece é quando vou listar eu estou fazendo o select assim:

 

mysql_select_db($database_DB_Connect, $DB_Connect);
$query_prova = sprintf("SELECT * FROM sis_prova, sis_resp_prova, sis_aluno WHERE sis_aluno.cpf = ".$cpf." AND sis_resp_prova.cod_prova1 != sis_prova.cod_prova AND sis_prova.curso =".$colname_prova);
$prova = mysql_query($query_prova, $DB_Connect) or die(mysql_error());
$row_prova = mysql_fetch_assoc($prova);
$totalRows_prova = mysql_num_rows($prova);

 

ou seja, a meu ver esse código seleciona prova enquanto o código da prova da tabela sis_prova for diferente do código da prova da tabela sis_resp_prova, de acordo com o CPF xxxxxxxxx e turma xxxxxxxxx

 

xxxxxxxx são valores passados por variáveis.

 

Entendeu a minha ideia?

 

Abraço!



Acho que nesse código estou listando as provas das duas tabelas em vez de listar somente o da tabela sis_prova. Não é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sql base

 

select *

from sis_prova, sis_resp_prova, sis_aluno

where sis_aluno.cpf = '12345678901'

and sis_resp_prova.cpf = sis_aluno.cpf

and sis_prova.cod_prova = sis_resp_prova.cod_prova1

 

pelo que vejo só quando faz a prova o registro existe, então

 

select *

from sis_prova, sis_aluno

where sis_aluno.cpf = '12345678901'

 

isto gera um cartesiano, então

 

select *

from sis_prova, sis_aluno

where sis_aluno.cpf = '12345678901'

and sis_prova.cod_prova not exists (

select *

from sis_prova sis_prova2, sis_resp_prova, sis_aluno sis_aluno2

where sis_aluno2.cpf = sis_aluno.cpf

and sis_resp_prova.cpf = sis_aluno2.cpf

and sis_prova2.cod_prova = sis_resp_prova.cod_prova1

and sis_prova2.cod_prova = sis_prova.cod_prova

)

 

 

Creio que funcione, deve ter uma solução melhor, mas não me ocorre agora

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apenas renomeadas pois as tabelas são instanciadas 2 vezes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, vou fazer os testes.

Respondo assim que tiver o resultado.

 

Abraço



ESTOU FAZENDO A CONSULTA DIRETO NO BANCO.

 

SELECT * FROM sis_prova,  sis_aluno WHERE sis_aluno.cpf = '123456' AND sis_prova.cod_prova NOT EXISTS (SELECT * FROM sis_prova sis_prova2, sis_resp_prova, sis_aluno sis_aluno2
                                                          WHERE sis_aluno2.cpf = sis_aluno.cpf
                                                          AND sis_resp_prova.cpf = sis_aluno2.cpf
                                                          AND sis_prova2.cod_prova = sis_resp_prova.cod_prova1
                                                          AND sis_prova2.cod_prova = sis_prova.cod_prova
                                                          )
 

 

E ESTÁ DANDO O SEGUINTE ERRO:

 

#1064 - 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 'EXISTS (SELECT * FROM sis_prova sis_prova2, sis_resp_prova, sis_aluno sis_aluno2' at line 1

Compartilhar este post


Link para o post
Compartilhar em outros sites


NOT EXISTS não precisa do campo, e se a query abaixo retorna valor ou não.

Não use * numa query de EXISTS pois trará resultados que não serão usados, use um NULL por exemplo pois a ideia e saber

se temos ou não resultados.

 

SELECT * FROM sis_prova, sis_aluno

WHERE sis_aluno.cpf = '123456'

AND NOT EXISTS (SELECT null

FROM sis_prova sis_prova2, sis_resp_prova, sis_aluno sis_aluno2

WHERE sis_aluno2.cpf = sis_aluno.cpf

AND sis_resp_prova.cpf = sis_aluno2.cpf

AND sis_prova2.cod_prova = sis_resp_prova.cod_prova1

AND sis_prova2.cod_prova = sis_prova.cod_prova )

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigão, no meu computador funcionou perfeitamente assim:

 

$query_prova = sprintf("SELECT * FROM sis_prova, sis_aluno 
							WHERE sis_aluno.cpf =".$cpf." AND sis_prova.curso=".$colname_prova." AND NOT EXISTS (SELECT null 
								 FROM sis_prova sis_prova2, sis_resp_prova, sis_aluno sis_aluno2 
								 WHERE sis_aluno2.cpf = sis_aluno.cpf 
                                 AND sis_resp_prova.matricula = sis_aluno2.cpf 
                                 AND sis_prova2.cod_prova = sis_resp_prova.cod_prova1 
                                 AND sis_prova2.cod_prova = sis_prova.cod_prova)");

 

 

Porém, quando upo para o servidor está dando a seguinte mensagem:

 

Coluna 'SGA0112' desconhecida em 'where clause'

 

sendo que SGA0112 é o texto que está na variável $colname_prova, que é a turma do aluno.

 

você tem ideia do que seja? já fiz de tudo aqui e nada, continua essa mensagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí não faço ideia.

A query ao menos funciona, deve ser algo realmente no Front-end.

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.