2016-06-20 46 views
1

我有3個表獲取計數byjoining多個表

1)question 
2)options 
3)answers 

表1中包含的多項選擇題名單。表2包含該問題的多種選擇。

考慮一個例子,我有一個問題「你最喜歡哪一款遊戲?」

它存儲在ID爲1的表1中。對於這個問題,表2中有3個選擇;作爲「板球」,「足球」,「網球」與ID 1,2 & 3.

當用戶回答這個問題時,在表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 | 
------------------------------------------------------- 

但是,當我嘗試,我沒有得到板球計數,因爲沒有一個選擇cricket.I必須讓板球的計數爲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 

回答

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 

請避免使用隱式連接語法(逗號分隔),並只使用一個連接正確的語法!隱式語法變得更難以閱讀並且更容易製造錯誤。

+0

工作正常。我是sql新手,所以我在這個查詢中花了很多時間。謝謝 –