1

リモートサーバーに保存されたハイスコアシステムを必要とする iPhone アプリを開発しています。

リストの 500 位にいる場合、画面には 495 から 505 の場所が表示されます。

編集 (これについて言及するのを忘れていました): 「ロンドン」、「スーパー ヒーロー チーム」、「フィクション ファン」など、複数のリストに参加できます。数百万のユーザーと数千のグループが存在する場合、すべてのリストで自分のプレースメント周辺の 10 か所を最も効率的に選択するにはどうすればよいですか?

私は次のことを考えました:

  • リストごとに 1 つ選択します。select * from scores where list = '$list' order by points desc limit $myplace-5, 10
  • すべてのリストを 1 回選択:select * from scores where list in ($lists) order by list, points desc次に、PHP を使用して適切なスポットを選択します。

すべての新しいデータベース タイプ (NoSQL など) が登場しましたが、この問題に最適なデータベース タイプはありますか?

たとえば、スコアを最初から適切な場所に挿入して、それぞれselectがデータを並べ替える必要がないようにしますか?

または、あなたの場所の周りの 10 か所をすばやく選択する方法はありますか? (正しい行を選択した場合、実際の並べ替えはクライアント側で発生する可能性があります)

4

2 に答える 2

1

最善の解決策は、必要な正確なデータを PHP ではなく SQL クエリで取得することです。NoSQL データベースを使用することは、おそらく問題には適していません。MySQL はその量のデータを問題なく処理します。

于 2013-02-15T08:01:21.477 に答える
0

以下のクエリを使用して、希望どおりに注文を直接取得できます

//user id
set @ID = 3; 

// get the score of the user
set @Score = (select score
              from users
              where ID = @ID);

//get the user who are less than you, and greather than you nad union them
select ID, Score
from (select U.ID, U.Score
      from users as U
      where U.ID <> @ID and
            U.Score < @Score
      order by U.Score desc limit 5) as P
union all
select U.ID, U.Score
from users U
where U.ID = @ID
union all
select *
from (select U.ID, U.Score
      from users as U
      where U.ID <> @ID and
            U.Score > @Score
      order by U.Score limit 5) as A
order by Score;   

ソース: https://stackoverflow.com/a/5796636/598424

于 2013-02-15T08:07:02.640 に答える