-3

我有一张这样的桌子:

| ID | game | player | their_turn |
===================================
| 1  | 1    | 1      | 0          |
-----------------------------------
| 2  | 1    | 2      | 1          |
-----------------------------------
| 3  | 1    | 3      | 0          |
-----------------------------------
| 4  | 1    | 4      | 0          |
-----------------------------------
| 5  | 1    | 5      | 0          |

我的目标是选择,按 ID 排序,对于特定游戏,紧接在 their_turn 为 1 的玩家之后,当达到最大 ID 时循环回到最低/第一个 ID。

例如,如果现在轮到玩家 2,我希望它选择玩家 3。如果轮到玩家 5,我希望它选择玩家 1。当它是玩家 1 时,它会选择玩家 2。

选择所有行后,我总是可以在 PHP 中对此进行一些处理,但我想知道如何在 MySQL 中正确执行此操作。

更新:新表结构

我最终重组了我的桌子;their_turn 现在移动到单独的表中(不相关的列除外):

Players          Rounds
| ID | game |    | ID | game | player |
=============    ======================
| 1  | 1    |    | 1  | 1    | 1      |
| 2  | 1    |    | 2  | 1    | 2      |
| 3  | 1    |
| 4  | 1    |
| 5  | 1    |

所以,同样的目标;选择排队的下一个玩家;要么是 ID 大于该游戏最新一轮玩家 ID 的人,要么是该游戏的最低玩家 ID。我从未在 MySQL 中使用过 IF 语句,我认为这是必要的,但我无法弄清楚如何去做。

4

2 回答 2

2

UPDATE这是对更改的表模式的查询

SELECT CASE WHEN player + 1 > max_id 
            THEN min_id
            ELSE player + 1
       END next_player
  FROM
(
  SELECT MAX(id) max_id, MIN(id) min_id
    FROM players
   WHERE game = 1
) p CROSS JOIN
(
  SELECT player 
    FROM rounds
   WHERE game = 1
   ORDER BY id DESC
  LIMIT 1
) r

输出:

| NEXT_PLAYER |
---------------
| 3 |

这是SQLFiddle演示

附带说明: 请停止更改您的问题。如果您更改了表架构或进行了其他重大更改,请评估并感谢您对原始问题的回答并发布新问题。

原始问题的答案: 当 id 不能保证是连续的时可能的解决方案

(
  SELECT *
    FROM Table1
   WHERE game = 1
   ORDER BY id
   LIMIT 1
)
 UNION ALL
(
  SELECT *
    FROM Table1
   WHERE game = 1
     AND ID > 
   (
     SELECT MIN(id) 
       FROM Table1 
      WHERE game = 1 
        AND their_turn = 1
   )
   ORDER BY id
   LIMIT 1
)
 ORDER BY id DESC 
 LIMIT 1

如果游戏的 id 总是连续的,那么你可以这样做

SELECT t.*
  FROM Table1 t 
 WHERE id = 
(
  SELECT CASE WHEN MAX(id * their_turn) + 1 > MAX(id) 
              THEN MIN(id) 
              ELSE MAX(id * their_turn) + 1 END next_id
    FROM Table1
   WHERE game = 1
)

根据您的样本数据,两种情况下的输出均为:

| 身份证 | 游戏 | 播放器 | THEIR_TURN |
----------------------------------
| 3 | 1 | 3 | 0 |

这是两个查询的SQLFiddle演示。

于 2013-08-03T03:40:16.750 回答
0

通用算法:

  • 找到 their_turn=1 的玩家的位置(提示:您需要创建一个排名以确定实际位置)
  • 从步骤 1 中选择位置 + 1 以玩家总数为模
于 2013-08-03T03:37:29.733 回答