这应该是一个非常简单的解决方案,这意味着你可能会认为这是一个愚蠢的问题,但我已经尝试了我能想到的一切。
我有两个表,一个用于可能的轮询选择,另一个用于实际响应。它们的结构如下:
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;
...没有任何“不”的记录。
我已经尝试了所有可以想到的联接语言,但结果却是错误的。
思想?
答案 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)
,并且瞧。