查询依赖于另外两个表和一列

时间:2012-12-16 03:39:05

标签: sql dependencies

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

描述
levelseries的一部分。 player可以完成level(保存在表players_levels_done中)。 在series levelorder列使用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}}

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
  )
;