Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Selecionar Aleatóriamente com vários Filtros


aldomm

Pergunta

Caro amigos, preciso de ajuda sobre uma query que busca questões de uma prova aleatóriamente de um banco de dados de questões. As questões têm suas propriedades que devem ter seus filtros ex. matéria e dificuldade. Não consigo fazer funcionar a query abaixo (pois dá erro de unable to parse query text). Ao executar dá erro de definição de parâmetros como @materia e @Dificuldade. Se a query for sem o filtro de matérias, ele funciona. Veja abaixo o que tenho:

SELECT * FROM

(SELECT TOP (@NumeroDePerguntasPorDificuldade) FROM

(SELECT * FROM Perguntas

WHERE Materia=@materia)

WHERE Dificuldade=1)

ORDER BY NEWID()

)

UNION

SELECT * FROM

(SELECT TOP (@NumeroDePerguntasPorDificuldade) FROM

(SELECT * FROM Perguntas

WHERE Materia=@materia)

WHERE Dificuldade=2)

ORDER BY NEWID()

)

..... um pra cada das 5 dificuldades. Assim no gerador de provas eu escolho uma matéria e quantas perguntas eu quero de cada nível de dificuldade.

Alguém pode ajudar???

Obrigado

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Amigo,

Depois da cláusula FROM, o sintaxe do SQL espera o nome de uma tabela válida. você não pode colocar um subselect e nem uma variável contendo o nome da tabela.

Outra coisa. Na sintaxe:

SELECT TOP (@NumeroDePerguntasPorDificuldade) FROM (SELECT * FROM Perguntas WHERE Materia=@materia) WHERE Dificuldade=2
Está faltando qual o campo de retorno. Ex.:
SELECT TOP (@NumeroDePerguntasPorDificuldade) * FROM (SELECT * FROM Perguntas WHERE Materia=@materia) WHERE Dificuldade=2

Qualquer dúvida, pode postar ai... :.)

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Fulvio, obrigado pelo interesse... Quanto ao * foi só um erro na digitação aqui... O que ocorre é que esse query abaixo funciona bem, veja:

SELECT * FROM

(SELECT TOP (@NumeroDePerguntasPorDificuldade) * FROM Perguntas

WHERE Dificuldade=1)

ORDER BY NEWID()

)

UNION

SELECT * FROM

(SELECT TOP (@NumeroDePerguntasPorDificuldade) * FROM Perguntas

WHERE Dificuldade=2)

ORDER BY NEWID()

)

.... para todas as dificuldades. Nesse caso acima, eu teria que ter um banco de perguntas por matéria, o q não é o que eu queria!

Como é que eu posso obter um resultado (que seria uma prova de perguntas aleatórias) em que eu possa escolher (fazer o filtro) a matéria (que é uma propriedade da pergunta) e ainda escolher quantas perguntas de cada nível de dificuldade. ex. meu banco é assim:

PerguntaID, Matéria, NívelDificuldade, Pergunta, RespostaA, RespostaB, RespostaC, RespostaD, RespostaCerta.

Se conseguir ver como posso fazer os dois filtros (materia e dificuldade) juntos em uma query que seleciona dessas sub-tabelas perguntas aleatóriamente seria o que eu preciso! rs

Agradeço desde já pelo apoio!

Aldo

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Aldo,

O ex. do Banco que postou são as tabelas que possui?

Peguei o exemplo que fez e tentei adaptar. Aí terá que fazer os relacionamentos entre as tabelas...

Tentei pegar as matérias e as dificuldades. Como quer randômico, dê um "order by rand()".

Ficaria mais o menos assim:

select top (@NumeroDePerguntasPorDificuldade) * from Pergunta p, Materia m
where p.Dificuldade in (1, 2) and m.CodigoMateria=p.CodigoPergunta
ORDER BY Rand()

Vai ficar faltando o restante das tabelas e seus relacionamentos. Caso não seja isto, pode postar... :.)

Link para o comentário
Compartilhar em outros sites

  • 0
Boa tarde Aldo,

O ex. do Banco que postou são as tabelas que possui?

Peguei o exemplo que fez e tentei adaptar. Aí terá que fazer os relacionamentos entre as tabelas...

Tentei pegar as matérias e as dificuldades. Como quer randômico, dê um "order by rand()".

Ficaria mais o menos assim:

select top (@NumeroDePerguntasPorDificuldade) * from Pergunta p, Materia m
where p.Dificuldade in (1, 2) and m.CodigoMateria=p.CodigoPergunta
ORDER BY Rand()
Vai ficar faltando o restante das tabelas e seus relacionamentos. Caso não seja isto, pode postar... :.)
Desculpe por não ter sido claro, mas é apenas uma tabela no banco com aquelas colunas. O código da Matéria vem de um combobox. Tentei adaptar o seu código mas não é bem isso que preciso. Eu estou nisso a uma semana, e é a última coisa que preciso para fechar o projeto... fogo né! Bem, ao assunto: Quando você faz uma query normal aleatória é assim:
SELECT TOP(@Numero_de_Perguntas_por_Dificuldade) * FROM
   (SELECT * FROM
        (SELECT * FROM Perguntas WHERE Materia=@materia)
    WHERE Dificuldade=@dificuldade) AS tb
ORDER BY NEWID()
Essa query não faz UNION com outra de parâmetro diferente de dificuldade. isto é, a forma abaixo não funciona:
SELECT TOP(@Numero_de_Perguntas_Muito_Fáceis) * FROM
   (SELECT * FROM
        (SELECT * FROM Perguntas WHERE Materia=@materia)
    WHERE Dificuldade=1) AS tb1
ORDER BY NEWID()

UNION

SELECT TOP(@Numero_de_Perguntas_Fáceis) * FROM
   (SELECT * FROM
        (SELECT * FROM Perguntas WHERE Materia=@materia)
    WHERE Dificuldade=2) AS tb2
ORDER BY NEWID()

UNION

SELECT TOP(@Numero_de_Perguntas_Regures) * FROM
   (SELECT * FROM
        (SELECT * FROM Perguntas WHERE Materia=@materia)
    WHERE Dificuldade=3) AS tb3
ORDER BY NEWID()

UNION

SELECT TOP(@Numero_de_Perguntas_Difíceis) * FROM
   (SELECT * FROM
        (SELECT * FROM Perguntas WHERE Materia=@materia)
    WHERE Dificuldade=4) AS tb4
ORDER BY NEWID()

UNION

SELECT TOP(@Numero_de_Perguntas_Muito_Difíceis) * FROM
   (SELECT * FROM
        (SELECT * FROM Perguntas WHERE Materia=@materia)
    WHERE Dificuldade=5) AS tb5
ORDER BY NEWID()

Em outras palavras, a lógica para fazer a query seria:

1- Criar uma tabela temporária resultado de uma query de todas perguntas do banco de uma matéria (i.e. SELECT * FROM Perguntas WHERE materia=@materia)

2- Desta tabela acima, fazer uma query selecionando todas perguntas de uma dificuldade (i.e. SELECT * FROM tabela_temporária WHERE dificuldade=@dificuldade) AS Segunda_tabela )

3- Sortear o número desejado de questões da tabela resultado da query do ítem 2 (i.e. SELECT TOP(@númeroDePerguntas) FROM Segunda_tabela ORDER BY NEWID() )

4- Unir cinco destas queries para cinco diferentes dificuldades de uma só matéria. (Nota: o banco possui várias matérias, cada matéria possui questões de 5 níveis de dificuldade)

O que não está funcionando é o comando UNION entre elas...

Link para o comentário
Compartilhar em outros sites

  • 0

Caro Fulvio, Muito Obrigado pela atenção!!!!

Por algum motivo Visual Studio não aceita essa query, mas ao finaliza-la assim mesmo, faz o que deve corretamente. Acho que é um problema do Visual Studio.

PROBLEMA RESOLVIDO:

SELECT        PerguntaID, Materia, Usuario, Pergunta, Alfa, Bravo, Charlie, Delta, Eco, AltenativaCorreta, ObjetivoReferencia, Dificuldade, QuestValidada, CodigoReferencia
FROM            (SELECT        TOP (@mf) PerguntaID, Materia, Usuario, Pergunta, Alfa, Bravo, Charlie, Delta, Eco, AltenativaCorreta, ObjetivoReferencia, Dificuldade, QuestValidada, 
                                                    CodigoReferencia
                          FROM            Perguntas
                          WHERE        (Dificuldade =1) AND (Materia=@mat)
                          ORDER BY NEWID()
                          UNION
                          SELECT        TOP (@f) PerguntaID, Materia, Usuario, Pergunta, Alfa, Bravo, Charlie, Delta, Eco, AltenativaCorreta, ObjetivoReferencia, Dificuldade, QuestValidada, 
                                                   CodigoReferencia
                          FROM            Perguntas AS Perguntas_5
                          WHERE        (Dificuldade = 2) AND (Materia=@mat)
                          ORDER BY NEWID()
                          UNION
                          SELECT        TOP (@r) PerguntaID, Materia, Usuario, Pergunta, Alfa, Bravo, Charlie, Delta, Eco, AltenativaCorreta, ObjetivoReferencia, Dificuldade, QuestValidada, 
                                                   CodigoReferencia
                          FROM            Perguntas AS Perguntas_4
                          WHERE        (Dificuldade = 3) AND (Materia=@mat) 
                          ORDER BY NEWID()
                          UNION
                          SELECT        TOP (@d) PerguntaID, Materia, Usuario, Pergunta, Alfa, Bravo, Charlie, Delta, Eco, AltenativaCorreta, ObjetivoReferencia, Dificuldade, QuestValidada, 
                                                   CodigoReferencia
                          FROM            Perguntas AS Perguntas_3
                          WHERE        (Dificuldade = 4) AND (Materia=@mat)
                          ORDER BY NEWID()
                          UNION
                          SELECT        TOP (@md) PerguntaID, Materia, Usuario, Pergunta, Alfa, Bravo, Charlie, Delta, Eco, AltenativaCorreta, ObjetivoReferencia, Dificuldade, QuestValidada, 
                                                   CodigoReferencia
                          FROM            Perguntas AS Perguntas_2
                          WHERE        (Dificuldade = 5) AND (Materia=@mat)
                          ORDER BY NEWID()) AS Aleatorio

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...