我正在建立一个在线调查系统,我想为其制作统计数据。我想根据用户的性别进行查询。我有以下表格:
我构造了以下查询,以便在没有问题答案的情况下返回空响应:
SELECT COUNT(sa.option_id) AS answer , so.option_label
FROM survey_answer sa
RIGHT JOIN survey_question_options so
ON sa.option_id = so.option_id AND
sa.record_date>='2011-09-01' AND
sa.record_date<='2012-08-01'
LEFT JOIN users u
ON (sa.uid = u.uid AND u.gender='F')
WHERE so.question_id=24
GROUP BY so.option_label
ORDER BY so.option_id ASC
我的查询返回以下结果集:
0 Red
1 Yellow
0 Blue
0 Green
但是,LEFT JOIN中的性别条件似乎在查询中被忽略。当我将性别更改为“M”时,会返回相同的结果。但是,对于所有事情,预期结果都是0。
我不确定我哪里出错了。请帮忙。
提前致谢。
答案 0 :(得分:1)
嗯,您正在主表的列上执行COUNT
,因此LEFT JOIN
上的性别条件不会影响结果。您应该在COUNT
表的列上执行users
。我不确定这是不是你想要的,但你应该尝试:
SELECT COUNT(u.uid) AS answer , so.option_label
FROM survey_answer sa
RIGHT JOIN survey_question_options so
ON sa.option_id = so.option_id AND
sa.record_date>='2011-09-01' AND
sa.record_date<='2012-08-01'
LEFT JOIN users u
ON (sa.uid = u.uid AND u.gender='M')
WHERE so.question_id=24
GROUP BY so.option_label
ORDER BY so.option_id ASC
答案 1 :(得分:0)
在加入答案表之后评估对用户表的左连接 - 因此,如果用户性别错误则不返回用户记录,则答案记录将返回(无论用户的性别如何)。尝试:
SELECT COUNT(sa.option_id) AS answer , so.option_label
FROM (select a.option_id
from survey_answer a
JOIN users u ON a.uid = u.uid AND u.gender='F'
where a.record_date>='2011-09-01' AND
a.record_date<='2012-08-01') sa
RIGHT JOIN survey_question_options so
ON sa.option_id = so.option_id
WHERE so.question_id=24
GROUP BY so.option_label
ORDER BY so.option_id ASC
答案 2 :(得分:0)
你把你的病情放在了错误的区域。由于您正在执行LEFT JOIN
(左边外部连接),因此左表(主表)中的所有内容以及来自联接表的数据一起被选中,适用的地方。您想要的是从 all users
添加数据,然后限制查询的完整输出。您实际完成的工作是仅添加女性用户的用户数据,然后显示所有数据。
听起来很技术,但您所要做的就是将AND u.gender='F'
移到主WHERE
子句而不是ON
子句中。这将导致SQL仅在JOIN
发生后为女性用户选择行。