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合体された値の最小値を選択するため、1 より大きいプレイヤー ID は 1 としてのみカウントされます。

2 つを追加すると、その部屋の 0 以外、NULL 以外のプレイヤー数が得られます。

于 2013-05-10T03:00:20.480 に答える
1

is notではなくid isの値を考慮することで、大幅に単純化できます。

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

SQLFiddle でこれを参照してください

このクエリは、テストの否定を使用しており、真の場合は減算しています。

mysql では、私がよく知っている他のすべてのデータベースで必要とされるように、case ステートメントを使用してテストを数値に変換するのではなく、単純にテストを数値的true1追加falseできる0ことに注意してください。

于 2013-05-10T03:43:58.083 に答える