mysql - 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
解决方案
如果我理解正确,您需要从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;
推荐阅读
- python - 尽管检测到所有元素,但未选择所有元素
- postgresql - 无法从 docker-compose postgresql 服务连接到 postico
- pandas - 如何使用apply用前一列值填充pandas列
- virtocommerce - 从源代码全新安装后 Virto Commerce 智能缓存模块出错
- php - MySQL:从两个表中的任何一个中删除行
- scala - Scala 为数据框中的每一行应用一个函数
- docker - 在 Docker 的 A VOLUME 中安装整个数据库(包括二进制文件)
- java - Maven - 如何对依赖于另一个项目的项目进行单元测试?
- rest - REST API 查询字符串
- python - 对变量有多个 == 语句