[mysql] Zliczanie odpowiedzi - warunki

0

Witam,

Mam taką tabelę w mysql i dane przykładowe:
id - respondent_id - question_symbol - answer
"1","1","pyt1","1"
"2","1","pyt2","1"

"3","2","pyt1","2"
"4","2","pyt2","1"

"5","1","pyt1","2"
"6","1","pyt2","1"

"7","1","pyt1","1"
"8","1","pyt2","2"

jeśli chcę policzy odpowiedzi na jedno pytanie to robię tak:
SELECT answer, count(*) as ilosc FROM tabela WHERE question_symbol = 'pyt1' GROUP BY answer
answer ilosc
1 - 2
2 - 3

Jak zrobić żeby policzyć to samo, ale dodatkowo z warunkiem pyt2=1? Czyli wybieram respondentów z warunkiem pyt2=1 i zliczam ilość odpowiedzi dla pyt1
Wynik powinien być:
answer ilosc
1 - 1
2 - 2

0

alternatywa:

WHERE question_symbol = 'pyt1'  or (question_symbol = 'pyt2' and naswer=1)
0

Chyba nie bardzo rozumiem albo nie można tego zrobić bez dodawania kolejnej kolumny do tabeli.

mam tabelę:

SELECT * FROM `app_framework_surveys_test`

id	respondent_id	question_symbol	answer	
1	1	pyt1	1	
2	1	pyt2	1	
3	2	pyt1	2	
4	2	pyt2	1	
5	1	pyt1	2	
6	1	pyt2	1	
7	1	pyt1	1	
8	1	pyt2	2	

Wykonuje zapytanie:

SELECT * FROM `app_framework_surveys_test` WHERE question_symbol = 'pyt1' OR (question_symbol = 'pyt2' AND answer=1)

id	respondent_id	question_symbol	answer	
1	1	pyt1	1	
2	1	pyt2	1	
3	2	pyt1	2	
4	2	pyt2	1	
5	1	pyt1	2	
6	1	pyt2	1	
7	1	pyt1	1	

ten wynik jest zły bo nie powinno być id=7 jak zadać poprawnie te zapytanie aby zostały tylko pary po respondent id ?

bo wtedy to:

SELECT answer, COUNT(*) AS ilosc FROM 
(SELECT * FROM `app_framework_surveys_test` WHERE question_symbol = 'pyt1' OR (question_symbol = 'pyt2' AND answer=1)) x 
WHERE question_symbol = 'pyt1' GROUP BY answer

i miałbym wynik jaki chcę:

answer	ilosc	
1	1
2	2	

a aktualnie mam:

answer	ilosc	
1	2
2	2	
0

Ja nie jestem wstanie zrozumieć tego co napisałeś, usciślij odpowiedzi:

  1. co to znaczy dodatkowo z warunkiem pyt2=1
    2. zostały tylko pary po respondent id
0

To od początku:
Mam tabele w niej wyniki ankiety, respondent_id, to jest jedna osoba, która wypełniła ankietę czyli id: 1 i 2 to jest jedna ankieta, id: 2 i 3 druga ankieta itd.
question_symbol, to jest pytanie a answer odpowiedz na to pytanie. Respondent_id, powtarza się bo dana osoba mogła kilka razy wypełnić ankietę.

Potrzebuję policzyć z ankiet odpowiedzi dla pytania pyt1 czyli robię tak:

SELECT answer, count(*) as ilosc FROM tabela WHERE question_symbol = 'pyt1' GROUP BY answer
answer  ilosc   
odpowiedz 1  występuje  2 razy
odpowiedz  2   występuje  2 razy   

i to jest ok.

Teraz potrzebuje policzyć odpowiedzi na pyt1, ale tylko z tych ankiet gdzie pyt2 jest 1 (czyli ankieta o id: 7 i 8 odpada bp nie spełnia warunku)

Czyli wynik powinien być:
answer ilosc
odpowiedz 1 występuje 1 razy
odpowiedz 2 występuje 2 razy

id  respondent_id   question_symbol answer  
1   1   pyt1    1   
2   1   pyt2    1  
 
3   2   pyt1    2   
4   2   pyt2    1   

5   1   pyt1    2   
6   1   pyt2    1   

7   1   pyt1    1   
8   1   pyt2    2   

Dzięki za zainteresowanie, mam nadzieję, że teraz już jest jaśniej.

0

Teraz takie pytanie, czy w tabeli jest klika ankiet czy jedna?
Czy odpowiedzi pytań jest zawsze tyle samo, w sensie czy jest możliwość, ze nie wprowadzone zostały odpowiedzi na które respondent nie odpowiedział?

0

Zakładając, że każda nakieta ma dwa pytania i są one w tabeli bezpośrednio po sobie to można stworzyć widok, który stworzy nam id dla każdej ankiety:

CREATE VIEW DANE
AS
SELECT 
  *
  , (SELECT COUNT(*)  FROM app_framework_surveys_test i WHERE app_framework_surveys_test.id > i.id) div 2 as survey_id 
 FROM 
   app_framework_surveys_test

i wykorzystać w zapytaniu

SELECT 
    answer
    , count(*) as ilosc 
FROM 
	DANE 
WHERE 
	question_symbol = 'pyt1' 
    AND survey_id in (SELECT survey_id from DANE where question_symbol = 'pyt2' and answer=1)
GROUP BY 
    answer
0
Panczo napisał(a):

Teraz takie pytanie, czy w tabeli jest klika ankiet czy jedna?
Czy odpowiedzi pytań jest zawsze tyle samo, w sensie czy jest możliwość, ze nie wprowadzone zostały odpowiedzi na które respondent nie odpowiedział?

Zawsze pracowałem na tabeli z danymi wyglądającej:

  • w kolumnach kolejne pytania: id, respondent_id, pyt1, pyt2 ... pyt200
  • wiersze to były kolejne odpowiedzi do danej ankiety

np.

id, respondent_id, pyt1, pyt2 ... pyt200
ankieta 1;1;1;2;1;2
ankieta 2;1;2;2;2;2

Problem był z modelem do ankiety bo dużo zmiennych było, ale łatwo można było wybierać / filtrować dane.

Poczytałem i postanowiłem zmienić tzn. kolumny przenieść w wiersze a wiersze w kolumny, tak jak wyżej napisałem.
Tabela z odpowiedziami wygada teraz, tak:

id;  respondent_id;   question_symbol; answer 
1;1;pyt1;1
2;1,pyt2;2
3;1;pyt3;1
.
.
200;1;pyt200;1
kolejne wiersze to kolejna ankieta
201;2;pyt1;2
202;2,pyt2;1
203;2;pyt3;2
.
.
400;2;pyt200;1

respondent id odwołuje się do tabeli z danymi obiektu badanego
Pytań jest od pyt1 do pyt200 - to jest jedna ankieta.

Tutaj jest problem, tak jak pisałem wybrać ankiety w których pyt1=1 i zliczyć odpowiedzi dla pyt2.
Nie wiem czy prościej nie będzie te pytanie filtrujące pyt1 przenieść do kolumny wtedy można będzie łatwo wybierać czyli:

id;  respondent_id;   question_symbol; answer, pyt1
1;1,pyt2;2;1
2;1;pyt3;1;1
.
.
200;1;pyt200;1

Tylko problem w tym, jak inne pytanie będzie filtrujące, to wtedy kolejne pytanie przepościć do kolumny ? W pewnym sensie wrócę w końcu do tego co miałem czyli kolejne kolumny to pytania a w wierszach odwiedzi.

Może jest jakiś inny sposób? Wydaje mi się (z tego co czytałem o normalizacji), że każde pytanie filtrujące musi być w kolejne kolumnie ? Czy dobrze rozumiem?

Edit:
zaraz jeszcze przemyślę Twoją drugą odpowiedź bo pytań w każdej ankiecie jest zawsze tyle samo i są po sobie.

0
SELECT * FROM ankiety WHERE question_symbol='pyt2' AND respondent_id IN (select respondent_id FROM ankiety WHERE question_symbol='pyt1' AND answer='1')

1 użytkowników online, w tym zalogowanych: 0, gości: 1