0

別のクエリによって更新されるランクを含む (ゲーム) リーダーボード テーブルがあります。それはIDを中心にしています-テーブルをクエリするとき、理想的にはN個のレコードを取得したいと考えています。したがって、次のように制限 N/2 で両方のレコードに対して UNION を実行しました。

(SELECT * FROM test1 t WHERE t.rank > (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank LIMIT 0, N/2)
UNION ALL
(SELECT * FROM test1 t WHERE t.rank <= (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank desc LIMIT 0, N/2) ORDER BY rank

リーダーボードのトップにいる場合、これはまったく機能しませんが、下位の N/2 のみが返されます。常に N レコードを返すようにする方法はありますか? 意図的に必要以上のレコードを取得し、必要のないレコードを切り取ることができると思いました。クエリでこれを行う方法はわかりませんが!

どんな助けでも感謝します:)

4

2 に答える 2

3

order byこれは、 and を巧みに使用して行うことができますlimit

SELECT t.*
FROM test1 t cross join
     (SELECT rank FROM test1 t2 WHERE id = @ID) as theone
ORDER BY ABS(theone.rank - t.rank)
LIMIT N;

おそらく、これらをランク順に戻したいと思うでしょう:

SELECT t.*
FROM (SELECT t.*
      FROM test1 t cross join
           (SELECT rank FROM test1 t2 WHERE id = @ID) as theone
      ORDER BY ABS(theone.rank - t.rank)
      LIMIT N
     ) t
ORDER BY t.rank;
于 2014-04-30T14:06:40.993 に答える
0

以下を試してください。

(SELECT * FROM test1 t WHERE t.rank > (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank LIMIT 0,N)
UNION ALL
(SELECT * FROM test1 t WHERE t.rank <= (SELECT rank FROM test1 t2 WHERE id=ID)+0 ORDER BY rank desc LIMIT 0,N)
ORDER BY rank
LIMIT 0,N

詳細については、マニュアルを参照してください。

于 2014-04-30T14:08:42.860 に答える