外连接提供内连接结果

时间:2013-06-27 17:11:52

标签: mysql

这应该是一个非常简单的解决方案,这意味着你可能会认为这是一个愚蠢的问题,但我已经尝试了我能想到的一切。

我有两个表,一个用于可能的轮询选择,另一个用于实际响应。它们的结构如下:

choices         responses
-----------     ----------
poll_id         poll_id
choice_id       user_id
choice_text     choice_id

我有一个有两个选项的轮询(是/否),所以我试图获取结果,这样如果没有人投票选择某个选项,那么该选项会显示在结果集中{{1}价值。因此,如果3个用户投了“是”并且没有投票选出“否”,我希望结果集为:

null

我原本以为这只是一个外连接:

choice_text      num
-----------------------------
yes              3
no               null

但是,唉,那就是给我:

select
    c.choice_text,
    count(*) num
from
    choices c
        left outer join responses r
            on c.poll_id = r.poll_id
            and c.choice_id = r.choice_id
where
    r.poll_id = 1
group by r.choice_id
order by r.choice_id asc;

...没有任何“不”的记录。

我已经尝试了所有可以想到的联接语言,但结果却是错误的。

思想?

2 个答案:

答案 0 :(得分:1)

外连接表上的where条件将外连接转换为内连接。将该条件移至JOIN

select c.choice_text,
       count(*) num
from choices c
   left outer join responses r
          on c.poll_id = r.poll_id
         and c.choice_id = r.choice_id
         and r.poll_id = 1
group by r.choice_id
order by r.choice_id asc;

顺便说一句:您对group by的使用不正确,而其他每个DBMS都会拒绝该语句。 MySQL只是选择返回随机数据而不是失败并出现错误。有关详细信息,请参阅以下博客:

答案 1 :(得分:0)

感谢@a_horse_with_no_name指出我正确的方向。

获胜的查询:

select c.choice_text,
       count(r.user_id) num
from choices c
   left outer join responses r
         on c.poll_id = r.poll_id
         and c.choice_id = r.choice_id
         and c.poll_id = 1
group by c.choice_id
order by c.choice_id asc;

将c.poll_id子句移动到连接,就像建议的@a_horse_with_no_name一样,但后来必须按选择表而不是响应表进行分组,最后将我的count(*)更改为count(r.user_id),并且瞧。