计算非空的列数

时间:2013-05-10 02:56:38

标签: mysql sql pdo

室:

+---------+---------+-----------+-------------+-------------+-------------+---------+
| room_id | room_no | room_stat | room_name   | player_a_id | player_b_id | turn_of |
+---------+---------+-----------+-------------+-------------+-------------+---------+
|       1 |       1 |         0 | blah        |           0 |           0 |       0 |
|       2 |       5 |         0 | second room |           1 |           3 |       0 |
|       3 |       3 |         0 | 3rd room    |           0 |           0 |       0 |
|       4 |       4 |         0 | 4th room    |           0 |           0 |       0 |
+---------+---------+-----------+-------------+-------------+-------------+---------+

我想计算一下这个房间里有多少玩家:例如:

  • 如果player_a_id!= 0或!NULL AND player_b_id!= 0或!NULL则 计数将 2
  • 如果只有player_a_id!= 0或者player_b_id!= 0那么 计数将 1
  • 如果player_a_id和player_b_id都是,则为else NULL然后返回 0 ;

4 个答案:

答案 0 :(得分:2)

我认为这是MySQL支持布尔运算的最短路径。

SELECT  room_no,
        (player_a_id IS NOT NULL AND player_a_id <> 0) + 
        (player_b_id IS NOT NULL AND player_b_id <> 0) AS totalNumber
FROM    room

感谢peterm :)

答案 1 :(得分:1)

您可以尝试以下方式:

select room_id,
       ((case when player_a_id <> 0 and player_a_id is not null then 1 else 0 end) +
        (case when player_b_id <> 0 and player_b_id is not null then 1 else 0 end)
       ) as NumInRoom
from room;

与NULL的比较实际上是不必要的。以下具有相同的效果:

select room_id,
       ((case when player_a_id <> 0 then 1 else 0 end) +
        (case when player_b_id <> 0 then 1 else 0 end)
       ) as NumInRoom
from room;

答案 2 :(得分:1)

select
   room_id, 
   (least(coalesce(player_a_id, 0), 1) + least(coalesce(player_b_id, 0), 1)) 
    as player_count
from room;

coalesce在其列表中选择第一个非NULL条目,因此它将提供实际的玩家ID,如果为NULL,则为0。

least选择合并值的最低值,因此任何玩家ID&gt; 1只会算作1。

添加两个,你有那个房间的非0,非NULL玩家数。

答案 3 :(得分:1)

您可以通过考虑id 的值来大大简化,而不是

select 2
  - ifnull(player_a_id = 0, 1)
  - ifnull(player_b_id = 0, 1)
from room

请参阅this in SQLFiddle

此查询使用测试的否定减去时为真。

请注意,在mysql中,true1false0,您可以在数字上添加测试而不是用例将测试转换为数字的语句,这是我熟悉的所有其他数据库所需要的。

相关问题