我有3张桌子
1)question
2)options
3)answers
表1包含多项选择题列表。表2包含问题的多个选项。
考虑一个例子,我有一个问题“你最喜欢哪个游戏?”
它存储在表1中,ID为1.对于这个问题,表2中有3个选项;作为“蟋蟀”,“足球”,“网球”与ids 1,2& 3。
当用户回答此问题时,问题ID和选项ID被存储到第三个表中,就好像他选择了足球一样,表3中的条目是问题ID和选项ID。
如果其他用户选择相同的选项,则表3中会存储新条目。
我的需要是我想得到表3中每个选项的计数。
考虑10个用户选择板球,15个用户选择足球,没有用户选择网球,所以我需要计数为10,15,0及其相应的选项ID
表名:问题
--------------------------------
| id | question |
--------------------------------
| 1 | which game u like most |
表名:选项
------------------------------------------------
| id | qid | option_name |
------------------------------------------------
| 1 | 1 | cricket |
------------------------------------------------
| 2 | 1 | football |
------------------------------------------------
| 3 | 1 | tennis |
------------------------------------------------
表名:答案
--------------------------------------------
| id | qid | optionId |
--------------------------------------------
| 1 | 1 | 3 |
---------------------------------------------
| 2 | 1 | 3 |
----------------------------------------------
| 3 | 1 | 2 |
----------------------------------------------
上表意味着,2人选择网球,1人选择足球,没有人选择板球。所以我需要结果表为
------------------------------------------------------
| id | question | option_name | count |
------------------------------------------------------
| 1 | which game u like most | cricket | 0 |
-------------------------------------------------------
| 2 | which game u like most | football | 1 |
-------------------------------------------------------
| 3 | which game u like most | tennis | 2 |
-------------------------------------------------------
但是当我尝试的时候,我没有得到板球的计数,因为没有人选择板球。我必须把板球的数量计为0.任何人都可以帮我解决问题吗? 我的sql代码是
SELECT count(an.optionId) count , op.option_name, q.question from
questions q, options op, answers an where q.id=1
and q.id=op.qid
and op.id=an.optionId
group by q.question, op.option_name
答案 0 :(得分:2)
只需使用LEFT JOIN
和COALESCE()
:
SELECT COALESCE(count(an.optionId),0) as count , op.option_name, q.question from
questions q
INNER JOIN options op
ON(q.id=op.qid )
LEFT OUTER JOIN answers an
ON(p.id=an.optionId)
where q.id=1
group by q.question, op.option_name
请避免使用隐式连接语法(以逗号分隔)并仅使用正确的连接语法! LEFT JOIN
隐式语法越来越难以阅读,更容易犯错误。