0

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

我有两张表,一张用于可能的民意调查选择,另一张用于实际响应。它们的结构如下:

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

我有一个有两个选择(是/否)的民意调查,所以我试图获取结果,以便如果没有人投票支持某个选择,该选择会在结果集中显示一个null值。因此,如果 3 个用户投了“是”而没有人投了“否”,我希望结果集是:

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;

但唉,这给了我:

choice_text      num
-----------------------------
yes              3

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

我已经尝试了所有我能想到的连接语言,但结果都是错误的。

想法?

4

2 回答 2

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 只是选择返回随机数据,而不是因错误而失败。有关更多详细信息,请参阅这些博客:

于 2013-06-27T17:14:40.357 回答
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 建议的那样,但随后不得不按选择表而不是响应表进行分组,最后将 my 更改count(*)count(r.user_id),瞧。

于 2013-06-27T17:26:29.303 回答