2016-06-25 28 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)