2016-06-25 25 views
1

我有2桌遊戲和賭注。我想要統計每場比賽的投注數量。但是,當我沒有爲特定遊戲ID進行投注時,我目前的查詢不包含遊戲。當行不存在時顯示計數值0 MYSQL

這裏是我當前的查詢:

SELECT g.*, 
     Count(*) AS participants 
FROM game g, 
     bet b 
WHERE b.game_id = g.id 
     AND USER = ? 
GROUP BY g.id 

因此,爲了更清楚可以說,我有我的遊戲桌3行。對於遊戲1,有4個賭注,對於遊戲2有2個賭注,並且在賭桌中沒有與遊戲3相關聯的行。結果應該是:

g1 4 
g2 2 
g3 0 

我很感激任何幫助。

+0

你需要'外Join',而不是'內join' –

回答

1

使用左連接並計算在賭注表中存在的列。對於未能加入投注表的遊戲記錄,預先分組的結果集中將返回一行,該結果集在投注表的所有列中都將爲空。由於count()聚合函數不計算空值,因此對於未能加入的遊戲記錄,您將得到零。

select g.*, count(b.game_id) participants 
from game g left join bet b on b.game_id=g.id 
where user=? 
group by g.id 
+2

我認爲這是一個不好的做法,只按them..even一個選擇所有列和組雖然MySQL允許你這樣做.. –

+0

這工作!所以我不得不這樣做,而不是正常的加入是離開加入!? –

+0

@vkp是的我只是想保持簡短的問題。感謝您的提醒,雖然 –

0

SELECT克。*,b.count(game_id)作爲參與者FROM遊戲克左連接上b.game_id = g.id和用戶打賭B =?由g.id分組;

Example 

mysql> SELECT * FROM calls; 
+----+------------+---------+ 
| id | date  | user_id | 
+----+------------+---------+ 
| 1 | 2016-06-22 |  1 | 
| 2 | 2016-06-22 | NULL | 
| 3 | 2016-06-22 | NULL | 
| 4 | 2016-06-23 |  2 | 
| 5 | 2016-06-23 |  1 | 
| 6 | 2016-06-23 |  1 | 
| 7 | 2016-06-23 | NULL | 
+----+------------+---------+ 
7 rows in set (0.00 sec) 

mysql> SELECT * FROM payments; 
+----+------------+---------+-------+ 
| id | date  | user_id | value | 
+----+------------+---------+-------+ 
| 1 | 2016-06-22 |  1 | 10 | 
| 2 | 2016-06-22 |  3 | 15 | 
| 3 | 2016-06-22 |  4 | 20 | 
| 4 | 2016-06-23 |  2 | 100 | 
| 5 | 2016-06-23 |  1 | 150 | 
+----+------------+---------+-------+ 
5 rows in set (0.00 sec) 

mysql> SELECT c.*,count(p.user_id) FROM calls c LEFT JOIN payments p ON p.user_id=c.user_id GROUP BY c.user_id; 
+----+------------+---------+------------------+ 
| id | date  | user_id | count(p.user_id) | 
+----+------------+---------+------------------+ 
| 2 | 2016-06-22 | NULL |    0 | 
| 1 | 2016-06-22 |  1 |    6 | 
| 4 | 2016-06-23 |  2 |    1 | 
+----+------------+---------+------------------+ 
3 rows in set (0.00 sec)