2016-05-31 9 views
0

私は、日常的に変更できるMMOゲームのための300人の最高ランクの選手を表示するシステムを構築しています。ダブルリミットオプションの選択行

トップ300人の選手を選んで、300人の選手に対して、私が選んだ同じテーブルから最後の30個のエントリを選択します。

ここでは、現在のクエリがあります。これは、正常かつ正確に上位300人のプレイヤーを選択します。

SELECT * FROM `experiencehistory` WHERE `worldid` = `7` ORDER BY `experiencehistory`.`date` DESC, `experiencehistory`.`rank` ASC LIMIT 300 

これは私のデータベース構造である:

ID - Identifies the entry for deletions etc later on. 
Characterid - Which character does this entry belong to. 
worldid - On which world does this character exist 
rank - what is the current (at the time of the entry, which is daily) rank the player has 
date - what date was the entry made on. (It saves a date through mktime() which is the day at 4am, all date entries for a specific date is the same. 

は今、前に述べたように私は選手を持って上記のクエリを使用して、どのように私は、このクエリはまた、彼らの最後の30個のエントリを取得することができますか?私は、それがうまくいかないと思っていませんでした。文字ごとに別のクエリをループして実行するだけでした。これは10-15秒のページの読み込みと多くのリソースの使用で終わりました。明らかに実際の環境では動作しませんでした。

私はGroup byを使用することを考えていますが、どのようにしてそれらを選択するのかはわかりません。すべての助けに感謝します。

+0

プレイヤーごとに最大30レコード、最大9000レコードが必要ですか?それとも、主人公の行に何らかの形でそれらを集約したいですか? – cyberbit

+0

それは私には意味がありません、あなたはこの文章を言い換えてください:*私は現在のトップ300です選択した同じテーブルから30の最後のエントリを選択したいと思います。* –

+0

Cyber​​bitは、私は英語が上手ではありませんが、あなたがしたいことを正確に得ています。だから、それは9000レコードになります。私は毎週と毎月の変更にそれを統合するつもりです(その部分が機能しているので、データの抽出方法を理解する必要があります)。 – Hultin

答えて

0

あなたのポストから、私はあなたがつもり、各プレーヤーから30件のエントリーをフェッチしているかを推測できなかったが、あなたは各プレイヤーのためのいくつかのコードを実行するためにこれを行うことができます:

$query = "SELECT * FROM `experiencehistory` WHERE `worldid` = 7 ORDER BY `experiencehistory`.`date` DESC, `experiencehistory`.`rank` ASC LIMIT 300" 

if ($link->multi_query($query)) { 
    do { 
     if ($result = $link->store_result()) { 
      while ($row = $result->fetch_row()) { 

      // do what you have to do to get the 30 entries here. 

      } 
      $result->free(); 
     } 
    } while ($link->next_result()); 
} 

$linkは、あなたの接続です。 ..

うまくいきます!

+0

@ダーレンの編集をありがとう! –