2

房间:

+---------+---------+-----------+-------------+-------------+-------------+---------+
| 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 都是 NULL 则返回0
4

4 回答 4

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

谢谢彼得 :)

于 2013-05-10T03:00:32.983 回答
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;
于 2013-05-10T02:59:26.430 回答
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 > 1 将仅计为 1。

将两者相加,您就有了该房间的非 0、非 NULL 玩家数。

于 2013-05-10T03:00:20.480 回答
1

您可以通过考虑 id是什么值而不是 is not来大大简化:

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

在 SQLFiddle 中看到这个

此查询使用测试的负数,并在为真时减去。

请注意,在 mysql 中,trueis1falseis0允许您简单地以数字方式添加测试,而不是使用 case 语句将测试转换为数字,这在我熟悉的所有其他数据库中都是必需的。

于 2013-05-10T03:43:58.083 回答