Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Saudações a todos, fiz uma pesquisa em tópicos anteriores e não encontrei algo que me ajudasse, então abro este novo tópico.
minha situação:
Tenho uma tabela onde crio vários questionários:
e minha tabela de respostas é esta:
CREATE TABLE IF NOT EXISTS `gc_resposta_questao` (
`RQ_IdRespQuest` int(10) NOT NULL AUTO_INCREMENT,
`RQ_IdVisitEmpreend` int(10) NOT NULL DEFAULT '0',
`RQ_IdQuest` int(10) NOT NULL DEFAULT '0',
`RQ_IdResp` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`RQ_IdRespQuest`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Eis o questionário:
1 - Escolaridade
[ ] A: Primeiro Grau
[ ] B: Segundo Grau
[ ] C: Superior
[ ] D: Mestrado
2 - Idade
[ ] A: 15 a 20 anos
[ ] B: 20 a 25 anos
[ ] C: 25 a 30 anos
[ ] D: 35 a 40 anos
3 - Etc.
Ao fazer uma pesquisa simples buscando apenas uma resposta de uma questão tenho um resultado satisfatório:
SELECT COUNT(DISTINCT RQ_IdVisitEmpreend) AS Total
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1'
AND RQ_IdResp = '4'
Porém o meu relatório precisa ser mais eficiente, preciso combinar vários critérios, por exemplo: quantos de 15 a 20 anos possuem o 2º Grau e tentei a seguinte consulta:
SELECT COUNT(DISTINCT RQ_IdVisitEmpreend) AS Total
FROM gc_resposta_questao
WHERE (RQ_IdQuest = '1' AND RQ_IdResp = '1')
OR (RQ_IdQuest = '2' AND RQ_IdResp = '4')
Porém de maneira nenhuma consigo um resultado satisfatório.
Alguém poderia me dar uma idéia de uma instrução sql mais eficaz?
De um modo que eu posso combinar os critérios?
Abraço a todos.
Mauro
>
por exemplo: quantos de 15 a 20 anos possuem o 2º Grau e tentei a seguinte consulta:
...
WHERE (RQ_IdQuest = '1' AND RQ_IdResp = '1')
OR (RQ_IdQuest = '2' AND RQ_IdResp = '4')
Isto retorna os registros que tem RQ_IdQuest = '1' E RQ_IdResp = '1' OU
que tem RQ_IdQuest = '2' AND RQ_IdResp = '4', não me parece ser a resposta a pergunta.
Responda quantos de 15 a 20 anos , depois faça possuem o 2º Grau e junte-os AND.
Ajudou ?
Eu já troquei o 'OR' pelo 'AND' e me retorna 0 (zero) registros
A minha necessidade é a combinação de múltiplos critérios
escolaridade - 2 grau
sexo - masculino
cidade - belo horizonte
etc.
Todos respresentados pelos seus respectivos id's tanto da pergunta quanto da resposta
mas estou inciando o teste com apenas dois, pensando: "Se eu faço com dois eu faço com vários, hehehehe"
mas com o AND não funciona:
SELECT COUNT( DISTINCT RQ_IdVisitEmpreend ) AS Total
FROM gc_resposta_questao
WHERE (
RQ_IdQuest = '1'
AND RQ_IdResp = '1'
)
AND (
RQ_IdQuest = '2'
AND RQ_IdResp = '4'
)
Mesmo estando entre parênteses o resultado é zero.
Talvez eu não entendi a sua resposta, tem como você, por favor, exemplificar em uma instrução sql?
Grato
Cada pergunta/Resposta é uma linha da tabela, não ?
Existe (caso positivo) uma Tabela com os Questionários ?
>
Cada pergunta/Resposta é uma linha da tabela, não ?
Existe (caso positivo) uma Tabela com os Questionários ?
Sim, seguem as tabelas
Questão:
CREATE TABLE IF NOT EXISTS `gc_questao` (
`QST_IdQuest` int(10) NOT NULL AUTO_INCREMENT,
`QST_Nom` varchar(200) NOT NULL,
PRIMARY KEY (`QST_IdQuest`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Resposta:
CREATE TABLE IF NOT EXISTS `gc_resposta` (
`RSP_IdResp` int(10) NOT NULL AUTO_INCREMENT,
`RSP_IdQuest` int(10) NOT NULL DEFAULT '0',
`RSP_Nom` varchar(200) NOT NULL,
PRIMARY KEY (`RSP_IdResp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Resposta x Questão:
CREATE TABLE IF NOT EXISTS `gc_resposta_questao` (
`RQ_IdRespQuest` int(10) NOT NULL AUTO_INCREMENT,
`RQ_IdVisitEmpreend` int(10) NOT NULL DEFAULT '0',
`RQ_IdQuest` int(10) NOT NULL DEFAULT '0',
`RQ_IdResp` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`RQ_IdRespQuest`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Eu posso criar vários questionários com suas respectivas questões, logo quando eu faço a busca eu agrupo com o campo RQ_IdVisitEmpreend, pois ele identifica a visita em que o questionário foi respondido e cada visita corresponde a um questionário, exemplo:
SELECT COUNT(DISTINCT RQ_IdVisitEmpreend) AS Total
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1'
AND RQ_IdResp = '4'
obtenho resultados satisfatórios quando busco por um único critério, porém não consigo o mesmo quando faço combinações de critérios
Se é o que entendi vejo uma solução, algo assim
select *
from gc_VisitEmpreend
where IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1'
AND RQ_IdResp = '4')
and IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '2'
AND RQ_IdResp = '3')
and IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '3'
AND RQ_IdResp = '1')
Ou seja, cada questão num sub-select.>
Se é o que entendi vejo uma solução, algo assim
select *
from gc_VisitEmpreend
where IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1'
AND RQ_IdResp = '4')
and IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '2'
AND RQ_IdResp = '3')
and IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '3'
AND RQ_IdResp = '1')
Ou seja, cada questão num sub-select.
MARAVILHA!
Funcionou perfeitamente, jamais em minha vida eu chegaria a uma solução como esta. MUITO OBRIGADO!
Veja como ficou o código ajustado às minhas necessidades:
select COUNT(VE_IdVisitEmpreend) AS Total
from gc_visit_empreend
where VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1'
AND RQ_IdResp = '1')
and VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '2'
AND RQ_IdResp = '4')
and VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '3'
AND RQ_IdResp = '10')
and VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
FROM gc_resposta_questao
WHERE RQ_IdQuest = '4'
AND RQ_IdResp = '12')
Meu caro Motta, às vezes faço algumas coisas boas e me acho excepcional, daí eu venho a este fórum e econtro pessoas como você e penso: "Como ainda tenho tanto a aprender... heehehhe"
Muito obrigado pela ajuda, tenho de apresentar o projeto amanhã e graças a você tudo correrá muito bem.
Abraços
Como Projeto está legal , mas uma solução profissional precisaria ser melhor pensada.
Boa sorte.
Esse tipo de modelo é melhor resolvido por bancos NoSQL como MongoDB.
Depois de uma pesquisada.
por exemplo: quantos de 15 a 20 anos possuem o 2º Grau e tentei a seguinte consulta:
...
WHERE (RQ_IdQuest = '1' AND RQ_IdResp = '1')
OR (RQ_IdQuest = '2' AND RQ_IdResp = '4')
Isto retorna os registros que tem RQ_IdQuest = '1' E RQ_IdResp = '1' OU
que tem RQ_IdQuest = '2' AND RQ_IdResp = '4', não me parece ser a resposta a pergunta.
Responda quantos de 15 a 20 anos , depois faça possuem o 2º Grau e junte-os AND.
Ajudou ?