2012-02-15 123 views
0

我正在构建一个我希望生成统计数据的在线调查系统。我希望根据用户的性别进行查询。我有以下表格:SQL连接多个表

  • survey_question_options
  • survey_answer
  • 用户

我已经构建了以下查询,以便它带回那里有这个问题没有答案空响应:

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

的左连接到用户表后评估联接到回答表 - 所以虽然如果用户是错误的性别,答案记录返回(不管是不是返回用户记录用户的性别)。尝试:

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 
1

那么,你是从主表中的列做一个COUNT,等等LEFT JOIN性别条件不会影响结果。您应该在users表的列上执行COUNT。我不确定这是否是您想要的,但您应该尝试:

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 
0

您正在将您的状况置于错误的块中。由于您正在执行LEFT JOIN(这是一个左边界外部连接),所以左边表格(主表格)中的所有内容都与连接表格(适用)中的数据一起选定。你想要的是从全部users添加数据,然后限制查询的完整输出。您实际上做的是仅添加来自女性用户的用户数据,然后显示所有数据。

声音是技术性的,但您所要做的就是将AND u.gender='F'移至主要的WHERE子句中,而不是ON子句。这将导致SQL仅在发生JOIN后为女性用户选择行。