Ir para conteúdo

POWERED BY:

Arquivado

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

Luan Ramos

Comparando duas linhas de duas tabelas diferentes

Recommended Posts

Olá pessoal.

 

Estou fazendo um sistema de provas em PHP e MYSQL, onde o professor cadastra a prova e as respostas, e o aluno responde a prova e recebe a nota na hora. O problema é que pro aluno receber a nota no ato de apertar o botão "Finalizar" eu preciso comprar o gabarito do professor com as respostas do aluno. Como segue no exemplo.

 

 

Tabela Prova(Respostas dada pelo professor)

Cod_prova|Resp1|Resp2|Resp3|Resp4|Resp5

 

 

Tabela Respostas (respostas dadas pelo aluno)

Cod_prova|Resp1|Resp2|Resp3|Resp4|Resp5|Nota

 

 

As respostas do aluno são associadas a prova pelo campo "Cod_prova".

 

Não faço ideia de como fazer essa comparação e pego o numero de acertos?? Alguém pode me dar uma luz??

 

Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

como se identifica o aluno ?

 

o que uma uma "resposta certa" ?

__professor.resp1=aluno.resp1 indica que a resposta 1 está correta ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

como se identifica o aluno ?

 

o que uma uma "resposta certa" ?

__professor.resp1=aluno.resp1 indica que a resposta 1 está correta ?

 

 

isso mesmo. Se professor.Resp1 = A e Aluno.Resp1 = A (RESPOSTA CERTA);

Compartilhar este post


Link para o post
Compartilhar em outros sites

deve existir um aluno.cod_aluno

 

 

select cod_aluno,
      ( (case when professor.Resp1 = aluno.Resp1 then 1 else 0 end) +
        (case when professor.Resp2 = aluno.Resp2 then 1 else 0 end) +
        (case when professor.Resp3 = aluno.Resp3 then 1 else 0 end) +
        (case when professor.Resp4 = aluno.Resp4 then 1 else 0 end) +
        (case when professor.Resp5 = aluno.Resp5 then 1 else 0 end) ) nota
from professor,aluno
where professor.Cod_prova = aluno.Cod_prova

Compartilhar este post


Link para o post
Compartilhar em outros sites

deve existir um aluno.cod_aluno

 

 

select cod_aluno,
      ( (case when professor.Resp1 = aluno.Resp1 then 1 else 0 end) +
        (case when professor.Resp2 = aluno.Resp2 then 1 else 0 end) +
        (case when professor.Resp3 = aluno.Resp3 then 1 else 0 end) +
        (case when professor.Resp4 = aluno.Resp4 then 1 else 0 end) +
        (case when professor.Resp5 = aluno.Resp5 then 1 else 0 end) ) nota
from professor,aluno
where professor.Cod_prova = aluno.Cod_prova

 

Vou testar e ainda hoje posto uma resposta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que eu esteja me batendo com bobagem, porém, aí vai:

 

$calcula_nota = sprintf("select cod_prova,
      ( (case when sis_prova.resp1 = sis_resp_prova.resp1 then 1 else 0 end) +
        (case when sis_prova.resp2 = sis_resp_prova.resp2 then 1 else 0 end) +
        (case when sis_prova.resp3 = sis_resp_prova.resp3 then 1 else 0 end) +
        (case when sis_prova.resp4 = sis_resp_prova.resp4 then 1 else 0 end) +
        (case when sis_prova.resp5 = sis_resp_prova.resp5 then 1 else 0 end) +
        (case when sis_prova.resp6 = sis_resp_prova.resp6 then 1 else 0 end) +
 (case when sis_prova.resp7 = sis_resp_prova.resp7 then 1 else 0 end) +
 (case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end) +) nota
      from sis_prova, sis_resp_prova
      where sis_prova.cod_prova =($_POST('codigo')) AND sis_resp_prova.cod_aluno = ($_POST('matricula'))
      ");

 

sis_prova = tabela professor

sis_resp_prova = tabela aluno

codigo = campo onde estará digitado o código da prova na página de resposta.

matricula = campo onde estará digitado o código do aluno na página de resposta.

 

acho que não estou conseguindo separar o código sql do php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque

 

(case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end) +) nota

 

por

 

(case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end)  ) nota

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque

 

(case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end) +) nota

 

por

 

(case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end)  ) nota

 

Já fiz isso. Porém, este código inteiro não é código sql e sim tem código php misturado, só que está tudo entre aspas como se fosse tudo sql. Não estou sabendo separar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se a query roda diretamente no BD, se rodar é erro no front-end

Compartilhar este post


Link para o post
Compartilhar em outros sites

retornou um conjunto vazio.

 

Porque o select está sendo feito no cod_aluno?

 

onde a coluna cod_aluno deve estar? no tabela da prova em sí ou na tabela da resposta?

 

e não era para retornar vazio pois, no teste que eu fiz todas as respostas estavam corretas. Ou seja, era pra retornar o numero 8 certo?

 

a consulta foi esta:

 

SELECT matricula,
      ( (case when sis_prova.resp1 = sis_resp_prova.resp1 then 1 else 0 end) +
        (case when sis_prova.resp2 = sis_resp_prova.resp2 then 1 else 0 end) +
        (case when sis_prova.resp3 = sis_resp_prova.resp3 then 1 else 0 end) +
        (case when sis_prova.resp4 = sis_resp_prova.resp4 then 1 else 0 end) +
        (case when sis_prova.resp5 = sis_resp_prova.resp5 then 1 else 0 end) +
 (case when sis_prova.resp6 = sis_resp_prova.resp6 then 1 else 0 end) +
 (case when sis_prova.resp7 = sis_resp_prova.resp7 then 1 else 0 end) +
 (case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end) ) nota
      from sis_prova, sis_resp_prova
      where sis_prova.cod_prova = sis_resp_prova.matricula

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente

 

SELECT matricula,
      ( (case when sis_prova.resp1 = sis_resp_prova.resp1 then 1 else 0 end) +
        (case when sis_prova.resp2 = sis_resp_prova.resp2 then 1 else 0 end) +
        (case when sis_prova.resp3 = sis_resp_prova.resp3 then 1 else 0 end) +
        (case when sis_prova.resp4 = sis_resp_prova.resp4 then 1 else 0 end) +
        (case when sis_prova.resp5 = sis_resp_prova.resp5 then 1 else 0 end) +
        (case when sis_prova.resp6 = sis_resp_prova.resp6 then 1 else 0 end) +
        (case when sis_prova.resp7 = sis_resp_prova.resp7 then 1 else 0 end) +
        (case when sis_prova.resp8 = sis_resp_prova.resp8 then 1 else 0 end) ) nota
      from sis_prova, sis_resp_prova
      where sis_prova.cod_prova = sis_resp_prova.cod_prova
order by matricula

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não retorna nenhum valor (Conjunto vazio).

 

Você poderia me add no skype? ou facebook. Acho que devo te explicar melhor o meu problema.

 

ai depois se resolvermos, postamos a resposta aqui.

 

skype: luan.estratego

 

Facebook: Luan Ramos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se existe a relação , faça

 

SELECT *
from sis_prova

 

SELECT *
from  sis_resp_prova 

 

Veja se existe a relação entre as tabelas, isto é se existem "cod_prova" correspondesntes nas duas tabelas.

 

Para retornar um conjunto vazio não foi possível fazer a relação.

 

Não posso usar face aqui no trabalho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT * FROM sis_prova, sis_resp_prova
WHERE 
sis_prova.resp1 = sis_prova.resposta1 OR
sis_prova.resp2 = sis_prova.resposta2 OR
sis_prova.resp3 = sis_prova.resposta3 OR
sis_prova.resp4 = sis_prova.resposta4 OR
sis_prova.resp5 = sis_prova.resposta5 OR
sis_prova.resp6 = sis_prova.resposta6 OR
sis_prova.resp7 = sis_prova.resposta7 OR
sis_prova.resp8 = sis_prova.resposta8 

 

Com isso consegui retornar os campos que são iguais. Creio que o caminho seja este, porém ainda não quero os campos iguais e sim o numero de campos iguais. E somente para um código de prova e uma matricula de aluno. Essas duas informações estarão digitadas na página.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você chegou a rodar os dois selects que passei ?

O que eles retornaram ?

 

Me parace que a query não consegui fazer a relação entre o gabarito do professor e a prova do aluno,

os "cod_prova" devem ter alguma diferença.

 

A sua queru no #16 está errada pois não liga prova à prova e sim resposta á resposta, vai ligar todas as respostas iguais idempedente da prova.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você chegou a rodar os dois selects que passei ?

O que eles retornaram ?

 

Me parace que a query não consegui fazer a relação entre o gabarito do professor e a prova do aluno,

os "cod_prova" devem ter alguma diferença.

 

A sua queru no #16 está errada pois não liga prova à prova e sim resposta á resposta, vai ligar todas as respostas iguais idempedente da prova.

 

Os selects que você me passou retornaram resultados. O que você sugere agora?

 

As tabelas estão assim:

 

Tabela sis_provas ( Onde está a prova com o gabarito cadastrado pelo professor ):

 

cod_prova

questoes

resp1

resp2

resp3

resp4

resp5

resp6

resp7

resp7

 

Tabela sis_resp_prova ( Onde estão as respostas dada pelo aluno )

cod_prova (digitado pelo aluno no textfield, ou seja, não vem de outra tabela)

cod_aluno (digitado pelo aluno no textfield, ou seja, não vem de outra tabela)

resposta1

resposta2

resposta3

resposta4

resposta5

resposta6

resposta7

resposta8

nota

 

O que eu quero de fato é. Na hora em que o aluno terminar de responder as questões, grade no banco apenas as suas respostas juntamente com o código da prova e o código do aluno. Porém, na mesma query, queria que em seguida ela verificasse quantas respostas o aluno acertou, e desse um UPDATE gravando a nota comparando com o gabarito do professor.

 

não poderia ser mais ou menos assim?

 

 SELECT sis_prova.cod_prova = ($_POST['field_codProva']),
      ( (case when sis_prova.resp1 = sis_resp_prova.resposta1 then 1 else 0 end) +
        (case when sis_prova.resp2 = sis_resp_prova.resposta2 then 1 else 0 end) +
        (case when sis_prova.resp3 = sis_resp_prova.resposta3 then 1 else 0 end) +
        (case when sis_prova.resp4 = sis_resp_prova.resposta4 then 1 else 0 end) +
        (case when sis_prova.resp5 = sis_resp_prova.resposta5 then 1 else 0 end) +
        (case when sis_prova.resp6 = sis_resp_prova.resposta6 then 1 else 0 end) +
        (case when sis_prova.resp7 = sis_resp_prova.resposta7 then 1 else 0 end) +
        (case when sis_prova.resp8 = sis_resp_prova.resposta8 then 1 else 0 end) ) nota
      from sis_prova
      where sis_resp_prova.cod_aluno = ($_POST['field_codAluno'])
order by sis_resp_prova.cod_aluno 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Os selects que você me passou retornaram resultados. O que você sugere agora?

 

Ok, verifique se os valores de um select existem no outro.Não só retornar resultado.

 

Não sei o tipo de cod_prova mas se ele for char veja se tem o mesmo tamanho na outra tabela

O select do post #13 não retorna nada pois a condição

where sis_prova.cod_prova = sis_resp_prova.cod_prova

não é atendida, ou seja, não existe um cod_prova da tabela sis_prova que corresponda ao cod_prova da tabela sis_resp_prova.

Compartilhar este post


Link para o post
Compartilhar em outros sites

havia uma cod_prova (INT e chave primaria) na tabela do gabarito e outro cod_prova (VARCHAR na tabela de resposta)

 

Modifiquei as duas para INT. E tentei realizar uma nova consulta da seguinte forma

 

SELECT cod_prova,
      ( (case when sis_prova.resp1 = sis_resp_prova.resposta1 then 1 else 0 end) +
        (case when sis_prova.resp2 = sis_resp_prova.resposta2 then 1 else 0 end) +
        (case when sis_prova.resp3 = sis_resp_prova.resposta3 then 1 else 0 end) +
        (case when sis_prova.resp4 = sis_resp_prova.resposta4 then 1 else 0 end) +
        (case when sis_prova.resp5 = sis_resp_prova.resposta5 then 1 else 0 end) +
        (case when sis_prova.resp6 = sis_resp_prova.resposta6 then 1 else 0 end) +
        (case when sis_prova.resp7 = sis_resp_prova.resposta7 then 1 else 0 end) +
        (case when sis_prova.resp8 = sis_resp_prova.resposta8 then 1 else 0 end) ) nota
      from sis_prova, sis_resp_prova
      where sis_prova.cod_prova = sis_resp_prova.cod_prova

 

o que me retornou o seguinte erro:

 

#1052 - Column 'cod_prova' in field list is ambiguous

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.