3

他の2つの条件に依存するテーブルから1つの行を取得する必要があるため、可能であれば問題を解決するための適切なクエリを探しています。

説明
Alevelはの一部ですseries。Aは(テーブルに保存された)playerを終了できます。内では、sは列を使用してソートされます。最下位の注文番号は、解決される最初のレベルです。今、私はプレイヤーが解決する必要がある次のレベルのを取得したいと思います。levelplayers_levels_doneserieslevelorderlevel_id

例1

プレーヤー9はすでにレベル5を終了しています。レベル5は最下位であるため、level_idこの特定のユーザーのシリーズ1の次の未解決レベルであるため、クエリは4を返す必要があります。

例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

ここに答えがあります。そしてそれは動作します!!

mysqlで動作するようにorderをlevel_orderに変更しました。

これは、SQLFiddleでも同じです。

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 に答える