Query para coletar dados de várias colunas da mesma linha, por Primary Key.

17/03/2020

0

Olá pessoal!

O que preciso é algo bem simples, acredito!

Tenho uma tabela (resposta_usuario) no BD que é para armazenar as respostas de um questionário. Nela há os dados de quem o preenche (nome, idade, cpf, etc...) e os dados das respostas (que vai de "resp1" até "resp80", sendo 80 perguntas). As opções de respostas são 4 (A, T, G e F). Ao final do preenchimento do questionário, preciso consultar na tabela (resposta_usuario) as respostas de 1 a 80 as letras que o usuário selecionou e quantas vezes essas letras se repetem em suas respostas.

Por exemplo, supondo que eu (Myller) responda ao questionário, receba o ID (primary key) 1 na tabela. Tenho como resposta "resp1" = A, "resp2" = A, "resp3" = G, "resp4" = F e por aí vai até chegar a "resp80".

O que preciso é:

De uma Query que me dê o número de vezes que a letra "A" aparece nas minhas (usuário Myller, de ID 1 da tabela resposta_usuario) respostas (que no caso, é 2 vezes), e a mesma coisa para as letras "T", "G" e "F".

Espero ter sido claro e agradeço a ajuda de todos!
Myller Meireles

Myller Meireles

Responder

Post mais votado

18/03/2020

vi que no MySQL utiliza-se a função CONCAT() para concatenar strings. então deve ser assim:
SELECT
	TAB.tr_id,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'A','')) LETRAA,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'T','')) LETRAT,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'G','')) LETRAG,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'F','')) LETRAF
FROM (
	SELECT
		tr_id,
		concat(
		tr_1 ,tr_2 ,tr_3 ,tr_4 ,tr_5 ,tr_6 ,tr_7 ,tr_8 ,tr_9 ,tr_10,
		tr_11,tr_12,tr_13,tr_14,tr_15,tr_16,tr_17,tr_18,tr_19,tr_20,
		tr_21,tr_22,tr_23,tr_24,tr_25,tr_26,tr_27,tr_28,tr_29,tr_30,
		tr_31,tr_32,tr_33,tr_34,tr_35,tr_36,tr_37,tr_38,tr_39,tr_40,
		tr_41,tr_42,tr_43,tr_44,tr_45,tr_46,tr_47,tr_48,tr_49,tr_50,
		tr_51,tr_52,tr_53,tr_54,tr_55,tr_56,tr_57,tr_58,tr_59,tr_60,
		tr_61,tr_52,tr_63,tr_64,tr_65,tr_66,tr_67,tr_68,tr_69,tr_70,
		tr_71,tr_52,tr_73,tr_74,tr_75,tr_76,tr_77,tr_78,tr_79,tr_80,
		tr_81
		) RESPOSTAS
	FROM
		tetra_respostas
	WHERE
		tr_id = 10
) TAB

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

17/03/2020

Emerson Nascimento

não conheço MySQL, mas posso te sugerir uma alternativa:
SELECT
	TAB.ID,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'A','')) LETRAA,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'T','')) LETRAT,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'G','')) LETRAG,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'F','')) LETRAF,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,' ','')) SEMPRESPOSTA
FROM (
	SELECT
		ID,
		resp1 +resp2 +resp3 +resp4 +resp5 +resp6 +resp7 +resp8 +resp9 +resp10+
		resp11+resp12+resp13+resp14+resp15+resp16+resp17+resp18+resp19+resp20+
		resp21+resp22+resp23+resp24+resp25+resp26+resp27+resp28+resp29+resp30+
		resp31+resp32+resp33+resp34+resp35+resp36+resp37+resp38+resp39+resp40+
		resp41+resp42+resp43+resp44+resp45+resp46+resp47+resp48+resp49+resp50+
		resp51+resp52+resp53+resp54+resp55+resp56+resp57+resp58+resp59+resp60+
		resp61+resp52+resp63+resp64+resp65+resp66+resp67+resp68+resp69+resp70+
		resp71+resp52+resp73+resp74+resp75+resp76+resp77+resp78+resp79+resp80 RESPOSTAS
	FROM
		resposta_usuario
) TAB

se os campos de resposta admitirem conteúdo NULL, utilize a função COALESCE() para pode obter o resultado desejado
SELECT
	TAB.ID,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'A','')) LETRAA,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'T','')) LETRAT,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'G','')) LETRAG,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'F','')) LETRAF,
	LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,' ','')) SEMPRESPOSTA
FROM (
	SELECT
		ID,
		COALESCE(resp1 ,' ')+COALESCE(resp2 ,' ')+COALESCE(resp3 ,' ')+COALESCE(resp4 ,' ')+COALESCE(resp5 ,' ')+
		COALESCE(resp6 ,' ')+COALESCE(resp7 ,' ')+COALESCE(resp8 ,' ')+COALESCE(resp9 ,' ')+COALESCE(resp10,' ')+
		COALESCE(resp11,' ')+COALESCE(resp12,' ')+COALESCE(resp13,' ')+COALESCE(resp14,' ')+COALESCE(resp15,' ')+
		COALESCE(resp16,' ')+COALESCE(resp17,' ')+COALESCE(resp18,' ')+COALESCE(resp19,' ')+COALESCE(resp20,' ')+
		COALESCE(resp21,' ')+COALESCE(resp22,' ')+COALESCE(resp23,' ')+COALESCE(resp24,' ')+COALESCE(resp25,' ')+
		COALESCE(resp26,' ')+COALESCE(resp27,' ')+COALESCE(resp28,' ')+COALESCE(resp29,' ')+COALESCE(resp30,' ')+
		COALESCE(resp31,' ')+COALESCE(resp32,' ')+COALESCE(resp33,' ')+COALESCE(resp34,' ')+COALESCE(resp35,' ')+
		COALESCE(resp36,' ')+COALESCE(resp37,' ')+COALESCE(resp38,' ')+COALESCE(resp39,' ')+COALESCE(resp40,' ')+
		COALESCE(resp41,' ')+COALESCE(resp42,' ')+COALESCE(resp43,' ')+COALESCE(resp44,' ')+COALESCE(resp45,' ')+
		COALESCE(resp46,' ')+COALESCE(resp47,' ')+COALESCE(resp48,' ')+COALESCE(resp49,' ')+COALESCE(resp50,' ')+
		COALESCE(resp51,' ')+COALESCE(resp52,' ')+COALESCE(resp53,' ')+COALESCE(resp54,' ')+COALESCE(resp55,' ')+
		COALESCE(resp56,' ')+COALESCE(resp57,' ')+COALESCE(resp58,' ')+COALESCE(resp59,' ')+COALESCE(resp60,' ')+
		COALESCE(resp61,' ')+COALESCE(resp52,' ')+COALESCE(resp63,' ')+COALESCE(resp64,' ')+COALESCE(resp65,' ')+
		COALESCE(resp66,' ')+COALESCE(resp67,' ')+COALESCE(resp68,' ')+COALESCE(resp69,' ')+COALESCE(resp70,' ')+
		COALESCE(resp71,' ')+COALESCE(resp52,' ')+COALESCE(resp73,' ')+COALESCE(resp74,' ')+COALESCE(resp75,' ')+
		COALESCE(resp76,' ')+COALESCE(resp77,' ')+COALESCE(resp78,' ')+COALESCE(resp79,' ')+COALESCE(resp80,' ') RESPOSTAS
	FROM
		resposta_usuario
) TAB

Responder

17/03/2020

Myller Meireles

Grande Emerson... grato por ajudar, amigo!

Ratificando: Os campos de respostas não admitem valores NULL. Eles são VARCHAR(1), Not NULL.

Porém, ao executar a query, o erro foi exibido: "Coluna 'ID' desconhecida em 'field list'"

Eu, não tenho ideia como resolver isso!

Responder

17/03/2020

Emerson Nascimento

Você disse que existe o campo ID na tabela. Pelo jeito não existe.

Responder

17/03/2020

Myller Meireles


Você disse que existe o campo ID na tabela. Pelo jeito não existe.


Mas existe sim, até disse que (hipoteticamente) recebi o ID 1, como primary key. Lembra?

Na minha tabela esse campo é o "tr_id", no qual substituí por:


SELECT TAB.tr_id, (...)

Não é isso? Se for, o erro persiste.

Responder

17/03/2020

Emerson Nascimento

SELECT
    TAB.tr_id, -- troquei aqui
    LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'A','')) LETRAA,
    LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'T','')) LETRAT,
    LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'G','')) LETRAG,
    LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,'F','')) LETRAF,
    LEN(TAB.RESPOSTAS)-LEN(REPLACE(TAB.RESPOSTAS,' ','')) SEMPRESPOSTA
FROM (
    SELECT
        tr_id, -- troquei aqui
        resp1 +resp2 +resp3 +resp4 +resp5 +resp6 +resp7 +resp8 +resp9 +resp10+
        resp11+resp12+resp13+resp14+resp15+resp16+resp17+resp18+resp19+resp20+
        resp21+resp22+resp23+resp24+resp25+resp26+resp27+resp28+resp29+resp30+
        resp31+resp32+resp33+resp34+resp35+resp36+resp37+resp38+resp39+resp40+
        resp41+resp42+resp43+resp44+resp45+resp46+resp47+resp48+resp49+resp50+
        resp51+resp52+resp53+resp54+resp55+resp56+resp57+resp58+resp59+resp60+
        resp61+resp52+resp63+resp64+resp65+resp66+resp67+resp68+resp69+resp70+
        resp71+resp52+resp73+resp74+resp75+resp76+resp77+resp78+resp79+resp80 RESPOSTAS
    FROM
        resposta_usuario
) TAB
Responder

18/03/2020

Myller Meireles

Emerson, meu nobre!

Fiz algumas pequenas modificações, são elas:

- Nas linhas 3 a 7, a função LEN dava "erro de função não existente", então troquei por LENGHT e rodou;
- Na linha 7, inseri o valor 0 (zero), pois não há resposta em branco/null;
- Na linha 20, inseri o "where tr_id = 10", que é um valor dinâmico que vem da variável URL.

Segue:

SELECT
    TAB.tr_id,     
    LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'A','')) LETRAA,
    LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'T','')) LETRAT,
    LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'G','')) LETRAG,
    LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'F','')) LETRAF,
    LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'0','')) SEMPRESPOSTA
FROM (
    SELECT
        tr_id,         
        tr_1 +tr_2 +tr_3 +tr_4 +tr_5 +tr_6 +tr_7 +tr_8 +tr_9 +tr_10+
        tr_11+tr_12+tr_13+tr_14+tr_15+tr_16+tr_17+tr_18+tr_19+tr_20+
        tr_21+tr_22+tr_23+tr_24+tr_25+tr_26+tr_27+tr_28+tr_29+tr_30+
        tr_31+tr_32+tr_33+tr_34+tr_35+tr_36+tr_37+tr_38+tr_39+tr_40+
        tr_41+tr_42+tr_43+tr_44+tr_45+tr_46+tr_47+tr_48+tr_49+tr_50+
        tr_51+tr_52+tr_53+tr_54+tr_55+tr_56+tr_57+tr_58+tr_59+tr_60+
        tr_61+tr_52+tr_63+tr_64+tr_65+tr_66+tr_67+tr_68+tr_69+tr_70+
        tr_71+tr_52+tr_73+tr_74+tr_75+tr_76+tr_77+tr_78+tr_79+tr_80+tr_81 RESPOSTAS
    FROM
        tetra_respostas where tr_id = 10
) TAB


Apesar da consulta rodar, o resultado não é o esperado. As colunas LETRAA, LETRAT, LETRAG, LETRAF, todas estão com zero e a coluna SEMRESPOSTA, com 1, quando o resultado esperado seria exibir a quantidade de letras A, T, G, F e 0 (zero) repetidas no questionário de ID 10, por exemplo. Entendeu?

Além disso, mais abaixo aparece um alerta: "Warning: #1292 Truncado errado DOUBLE valor: 'A'"

Segue link da imagem dos resultados: https://drive.google.com/open?id=1eumHLCVeW4LTW1_RnjNICZMU3DT7S4iV
Responder

18/03/2020

Myller Meireles

Fala Emerson...

Cara, agora sim deu 100% certo a parte do SQL!!!

O que estou precisando (para finalizar, em definitivo), é trazer os resultados das colunas "LETRAA", "LETRAT", "LETRAG" e "LETRAF" que estão no SQL para a tela do browser (to usando o PHP), mas não sei como "desenrolar" o que preciso para isso acontecer, no código da query.

Para vc entender melhor, segue abaixo o link da imagem com os resultados esperados.

https://drive.google.com/file/d/1b38ej67PYj1VVV7nPppByrWRCUhFr5nD/view?usp=sharing

Obrigado!
Responder

19/03/2020

Myller Meireles

Emerson,

Faltou complementar minha resposta de ontem... o código PHP que estou usando é esse para trazer os dados da consulta e mesmo assim não exibe nada.

<?php echo $row_resposta['tr_id']; ?>
<?php echo $row_resposta['RESPOSTAS']; ?>
<?php echo $row_resposta['LETRAA']; ?>
<?php echo $row_resposta['LETRAT']; ?>
<?php echo $row_resposta['LETRAG']; ?>
<?php echo $row_resposta['LETRAF']; ?>



O que poderia ser?

Grato!

OBS: Não sei porquê o código PHP saiu com aspas duplas.
Responder

21/03/2020

Myller Meireles

Finalmente achei o erro!!!

Eles estão nas linhas 17 e 17, em: "tr_52" e "tr_52", onde o correto é: "tr_62" e "tr_t2", respectivamente... por isso os resultados não estavam sendo exibidos como esperado.
Responder

21/03/2020

Myller Meireles

vi que no MySQL utiliza-se a função CONCAT() para concatenar strings. então deve ser assim:
SELECT
	TAB.tr_id,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'A','')) LETRAA,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'T','')) LETRAT,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'G','')) LETRAG,
	LENGTH(TAB.RESPOSTAS)-LENGTH(REPLACE(TAB.RESPOSTAS,'F','')) LETRAF
FROM (
	SELECT
		tr_id,
		concat(
		tr_1 ,tr_2 ,tr_3 ,tr_4 ,tr_5 ,tr_6 ,tr_7 ,tr_8 ,tr_9 ,tr_10,
		tr_11,tr_12,tr_13,tr_14,tr_15,tr_16,tr_17,tr_18,tr_19,tr_20,
		tr_21,tr_22,tr_23,tr_24,tr_25,tr_26,tr_27,tr_28,tr_29,tr_30,
		tr_31,tr_32,tr_33,tr_34,tr_35,tr_36,tr_37,tr_38,tr_39,tr_40,
		tr_41,tr_42,tr_43,tr_44,tr_45,tr_46,tr_47,tr_48,tr_49,tr_50,
		tr_51,tr_52,tr_53,tr_54,tr_55,tr_56,tr_57,tr_58,tr_59,tr_60,
		tr_61,tr_62,tr_63,tr_64,tr_65,tr_66,tr_67,tr_68,tr_69,tr_70,
		tr_71,tr_72,tr_73,tr_74,tr_75,tr_76,tr_77,tr_78,tr_79,tr_80,
		tr_81
		) RESPOSTAS
	FROM
		tetra_respostas
	WHERE
		tr_id = 10
) TAB



Finalmente achei o erro!!!

Eles estão nas linhas 17 e 18 da query, em: "tr_52" e "tr_52", onde o correto é: "tr_62" e "tr_72", respectivamente... por isso os resultados não estavam sendo exibidos como esperado.


Sempre suspeitei de algum erro no SQL... ufa!!! Segue o jogo... valeu Emerson!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar