2

だから私はこのゲームデータベースを持っています、そこにはフィールド、ID、名前、ポイントを持つ複数のユーザーがいます

ポイントの量に関連してその位置を確認できる特定のユーザーのランクテーブルが必要です。テーブルには8つの位置の余地があるため、次の方法を探していました。

SELECT * FROM users WHERE id = {user_id} ORDER By pointsこのIDの前に4つの結果を選択し、後に3つの結果を選択します。これを行うためのクエリはありますか?結果は次のようになります。

---------------------
|id   |name  |points|
---------------------
| 52  |name1 | 10   |
---------------------
| 23  |name1 | 09   |
---------------------
| 93  |name1 | 08   |
---------------------
| 12  |name1 | 07   |
---------------------
| 43  |queried_name1 | 06   |
---------------------
| 67  |name1 | 05   |
---------------------
| 32  |name1 | 04   |
---------------------
| 91  |name1 | 03   |
---------------------

私はこれをソフトウェアで作成しようとしましたが、すべての結果を反復処理するのはかなり遅いです。ご協力いただきありがとうございます!

4

2 に答える 2

1

そのように、私は上記の結果のために言うでしょう:

SELECT * FROM users WHERE points > (SELECT points FROM users WHERE id = {user_id}) ORDER By points ASC LIMIT 3;

以下の結果について:

SELECT * FROM users WHERE points < (SELECT points FROM users WHERE id = {user_id}) ORDER By points DESC LIMIT 4;

したがって、大きな組合では、次のようになります。

SELECT * FROM (SELECT * FROM users WHERE points > (SELECT points FROM users WHERE id = {user_id}) ORDER By points ASC LIMIT 3 ) a 
UNION
SELECT * FROM users WHERE id = {user_id}
UNION
SELECT * FROM (    SELECT * FROM users WHERE points < (SELECT points FROM users WHERE id = {user_id}) ORDER By points DESC LIMIT 4 ) b
于 2012-06-12T05:54:13.407 に答える
1

このクエリを使用できます-

SELECT id, name, points FROM (
  SELECT u.*, @r:=@r+1 rank, @pos:=IF(@pos = 0 AND name = 'queried_name1', @r, @pos)
    FROM users u,
    (SELECT @r:=0, @pos:=0) t
  ORDER BY points DESC
  ) t
WHERE rank BETWEEN @pos - 4 AND @pos + 3

テーブルをポイントでランク付けし、name ='queried_name1'のレコードを検索し、見つかったレコードの前後の行をいくつか選択します。

于 2012-06-12T06:06:19.043 に答える