首页 > 解决方案 > Mysql根据不同的选择获得一行

问题描述

我有 4 个表:一个称为游戏,其中包含我的应用程序的所有游戏,另一个表表示玩家可以加入的游戏(或关卡)的“步骤”,然后是用户表,因为用户为他加入的每个游戏创建一个玩家

所以桌子是游戏、步骤、玩家和用户。这是游戏桌:

game_id  game_name
1        game1
2        game2

这是步骤表(列票证是确定动作的计数器,step_num 是确定默认步骤的列):

step_id  step_tickets  step_game  step_num
1        384           1          1
2        742           1          2
3        21            2          1

这是玩家桌

player_id  player_step  player_user
1          2            1

还有 users 表,它有一个 id 和一些我们现在不需要的其他信息。

我想根据给定的用户和游戏从步骤表中获取 step_tickets。例如,如果我给用户 1 和游戏 1,我想获取步骤表的第 2 行,因为用户 1 有玩家 1,它加入了步骤 2。如果我给用户 2 和游戏 1,用户没有玩家,所以默认情况下我想要第 1 行。

我使用Mysql 5.6版

我尝试使用此代码,但没有任何结果......有人可以帮助我吗?提前谢谢您,如果您需要其他信息,请告诉我。

SELECT 
    p.tickets AS mytickets, 
FROM games 
LEFT JOIN 
( 
    SELECT 
        IF(t.step_tickets IS NULL, d.step_tickets, t.step_tickets) AS tickets,
        IF(t.step_game IS NULL, d.step_game, t.step_game) AS step_game,
        IF(t.step_id IS NULL, d.step_id, t.step_id) AS step_id
    FROM steps
    LEFT JOIN
    ( 
        SELECT 
            `step_tickets`, 
            `step_game`, 
            `step_id`,
        FROM steps 
        INNER JOIN players ON (players.player_step=step_id AND players.player_user=1)
    ) 
    AS t ON t.step_id=steps.step_id
    LEFT JOIN
    ( 
        SELECT 
            `step_tickets`, 
            `step_game`, 
            `step_id` 
        FROM steps 
        WHERE `step_num`=1 
    ) 
    AS d ON d.step_id=steps.step_id
    GROUP BY step_id
) 
AS p ON p.step_game=games.game_id
WHERE game_id=1

标签: mysqlsqlselect

解决方案


如果我理解正确,您需要从steps. 这一行应该与游戏相匹配。并且,如果可能,还要匹配用户。如果没有用户,则可以退回。

如果是这样:

select s.*
from steps s left join
     players p
     on p.player_step = s.step_id
where s.step_game = $game and
      (p.user_id = $user or p.user_id is null)
order by (p.user_id is not null) desc
limit 1;

推荐阅读