我需要从一个依赖于其他两个条件的表中获取一行,所以如果可能的话,我正在寻找一个很好的查询来解决我的问题。
描述
level
是series
的一部分。 player
可以完成level
(保存在表players_levels_done
中)。
在series
level
内order
列使用level_id
列进行排序。最低订单号是要解决的第一个级别。
现在我想获得玩家需要解决的下一级level_id
。
示例#1
播放器9已经完成了第5级。由于第5级是最低级别,因此查询应该返回
level_id
4,因为它是此特定用户的系列1中的下一个未解决级别。
示例#2
玩家19已经完成了11级。但是11级不是该系列中第一个有序的级别,因此查询应该返回
levels
12。
如果玩家解决了系列的所有级别,则查询应返回总行数0.
表id (level_id) | series_id | order
--------------+-----------+------
4 | 1 | 20
5 | 1 | 10
6 | 1 | 30
11 | 2 | 60
12 | 2 | 50
13 | 2 | 70
players_levels_done
表player_id | level_id
----------+---------
9 | 5
19 | 11
series
表id (series_id) | ...
---------------+----
1 | ...
2 | ...
players
表id (player_id) | ...
---------------+----
9 | ...
19 | ...
{{1}}
答案 0 :(得分:3)
这是一个答案。它有效!!
我将命令更改为level_order以在mysql中使用它。
Here is the same in SQL Fiddle尝试一下。
select
pout.player_id, lout.id
from
levels as lout,
players_levels_done as pout
where
lout.level_order in (
select
min(l1.level_order )
from
levels as l1,
players_levels_done as p1
where
l1.id not in
(
select
level_id
from
players_levels_done
where
player_id = p1.player_id
)
and
l1.series_id =
(
select
distinct l.series_id
from
levels as l,
players_levels_done as p
where
p.level_id = l.id
and
player_id = p1. player_id
)
and p1.player_id = pout.player_id
group by p1.player_id
)
;