MySQL子查询和包围

时间:2010-05-20 10:05:00

标签: sql 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语句中以显示答案? 我想生产这样的东西:

ex:受访者数量为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

1 个答案:

答案 0 :(得分: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),或'&lt; b r> ”。