2010-05-20 34 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。 – 2011-03-13 18:21:51

回答

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_pa​​cket的值約束,但可將值設置得更高。

根據您的平臺,還應該將'\ n'中的分隔符替換爲char(13)或char(10)或'< b r''。