SQL连接多个表

时间:2012-02-15 12:08:58

标签: php mysql sql join left-join

我正在建立一个在线调查系统,我想为其制作统计数据。我想根据用户的性别进行查询。我有以下表格:

  • 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。

我不确定我哪里出错了。请帮忙。

提前致谢。

3 个答案:

答案 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发生后为女性用户选择行。