2010-05-20 3 views
0

Вот мои таблицыMySQL подзапрос и брекет

респондентов:

field   sample value 
respondentid : 1 
age   : 2 
gender  : male 

survey_questions:

id   : 1 
question  : Q1 
answer  : sample answer 

ответы:

respondentid : 1 
question  : Q1 
answer  : 1 --id of survey question 

Я хочу отобразить всех респондентов, которые ответили на определенный опрос, отобразить все ответы и суммировать весь ответ и сгруппировать их в соответствии с возрастной шкалой.

Я попытался с помощью этого запроса:

SELECT 
res.Age, 
res.Gender, 
answer.id, 
answer.respondentid, 
SUM(CASE WHEN res.Gender='Male' THEN 1 else 0 END) AS males, 
SUM(CASE WHEN res.Gender='Female' THEN 1 else 0 END) AS females, 
CASE 
    WHEN res.Age < 1 THEN 'age1' 
    WHEN res.Age BETWEEN 1 AND 4 THEN 'age2' 
    WHEN res.Age BETWEEN 4 AND 9 THEN 'age3' 
    WHEN res.Age BETWEEN 10 AND 14 THEN 'age4' 
    WHEN res.Age BETWEEN 15 AND 19 THEN 'age5' 
    WHEN res.Age BETWEEN 20 AND 29 THEN 'age6' 
    WHEN res.Age BETWEEN 30 AND 39 THEN 'age7' 
    WHEN res.Age BETWEEN 40 AND 49 THEN 'age8' 
    ELSE 'age9' 
END AS ageband 
FROM Respondents AS res 
INNER JOIN Answers as answer ON answer.respondentid=res.respondentid 
INNER JOIN Questions as question ON answer.Answer=question.id 
WHERE answer.Question='Q1' GROUP BY ageband ORDER BY res.Age ASC 

Я был в состоянии получить данные, но список всех ответов нет. Должен ли я подзапросить SELECT в моей текущей инструкции SELECT, чтобы отобразить ответы? Я хочу, чтобы производить что-то вроде этого:

например: # респондентов в возрасте от 3: 2,3 и 6

Question: what are your favorite subjects? 

Ages 1-4: 
     subject 1:  1 
     subject 2:  2 
     subject 3:  2 

total respondents for ages 1-4 : 2 

Ages 5-10: 
     subject 1:  1 
     subject 2:  1 
     subject 3:  0 

total respondents for ages 5-10 : 1 
+0

У вас есть два кронштейна, начинающихся и заканчивающихся в том же возрасте, что и «4», что скорее всего испортит ваш запрос. Возможно, это просто опечатка, но вы должны скорректировать 4-9 кронштейн вместо 5-9. –

ответ

0
SELECT 
res.Age, 
res.Gender, 
answer.id, 
answer.respondentid, 
SUM(CASE WHEN res.Gender='Male' THEN 1 else 0 END) AS males, 
SUM(CASE WHEN res.Gender='Female' THEN 1 else 0 END) AS females, 
group_concat(answer.answer separator '\n') answers 
CASE 
    WHEN res.Age < 1 THEN 'age1' 
    WHEN res.Age BETWEEN 1 AND 4 THEN 'age2' 
    WHEN res.Age BETWEEN 4 AND 9 THEN 'age3' 
    WHEN res.Age BETWEEN 10 AND 14 THEN 'age4' 
    WHEN res.Age BETWEEN 15 AND 19 THEN 'age5' 
    WHEN res.Age BETWEEN 20 AND 29 THEN 'age6' 
    WHEN res.Age BETWEEN 30 AND 39 THEN 'age7' 
    WHEN res.Age BETWEEN 40 AND 49 THEN 'age8' 
    ELSE 'age9' 
END AS ageband 
FROM Respondents AS res 
INNER JOIN Answers as answer ON answer.respondentid=res.respondentid 
INNER JOIN Questions as question ON answer.Answer=question.id 
WHERE answer.Question='Q1' GROUP BY ageband ORDER BY res.Age ASC; 

Вы должны установить переменную group_concat_max_len системы на более высокое значение:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

результат усекается до максимальной длины, которая задается group_concat_max_len системной переменной, которая имеет значение по умолчанию 1024. Значение может быть установлено выше, хотя эффективная максимальная длина возвращаемого значения ограничена значением max_allowed_packet.

В зависимости от вашей платформы вы также должны заменить разделитель с '\ n' на char (13) или char (10) или '< b r>'.

Смежные вопросы