当行不存在MYSQL时显示计数值0

时间:2016-06-25 02:45:14

标签: mysql sql count

我有2桌游戏和投注。我想计算每场比赛的投注数量。但是,当没有特定游戏ID的赌注时,我当前的查询不包括游戏。

这是我当前的查询:

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

所以为了让它更清晰,我可以说我的Game表中有3行。对于game1有4个投注,对于game2有2个投注,并且在Bet表中没有与game3相关联的行。结果应该是:

g1  4
g2  2
g3  0

我很感激任何帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

SELECT g。*,b.count(game_id)作为参与者来自游戏g LEFT加注下注b b.game_id = g.id和user =?分组由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)