室:
+---------+---------+-----------+-------------+-------------+-------------+---------+
| 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 |
+---------+---------+-----------+-------------+-------------+-------------+---------+
我想计算一下这个房间里有多少玩家:例如:
答案 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
此查询使用测试的否定,减去时为真。
请注意,在mysql中,true
为1
而false
为0
,您可以在数字上添加测试而不是用例将测试转换为数字的语句,这是我熟悉的所有其他数据库所需要的。