通过连接多个表来计数

时间:2016-06-20 10:33:15

标签: mysql sql

我有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

1 个答案:

答案 0 :(得分:2)

只需使用LEFT JOINCOALESCE()

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隐式语法越来越难以阅读,更容易犯错误。