3

我需要从一个取决于其他两个条件的表中获取一行,所以如果可能的话,我正在寻找一个很好的查询来解决我的问题。

说明
Alevel是 a 的一部分series。Aplayer可以完成一个level(保存在表中players_levels_done)。在 a中,使用列serieslevels 进行排序order。最低的订单号是要解决的第一级。现在我想获得level_id玩家需要解决的下一个级别。

示例 #1

玩家 9 已完成第 5 级。由于第 5 级是最低顺序,因此查询应返回level_id4,因为它是该特定用户系列 1 中下一个未解决的级别。

示例 #2

玩家 19 已完成第 11 关。但第 11 关不是系列中第一个排序的关卡,因此查询应返回level_id12。

如果玩家解决了系列的所有级别,则查询应返回总行数 0。

桌子levels

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             | ...
4

1 回答 1

3

这是一个答案。它有效!

我将 order 更改为 level_order 以在 mysql 中使用它。

这是在 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
  )
;
于 2012-12-16T04:13:35.660 回答