1

次の関係があるとしましょう。

╔═══════════════════╗
║ i++ name  score   ║
╠═══════════════════╣
║ 1   Will  123     ║
║ 2   Joe   100     ║
║ 3   Bill  99      ║
║ 4   Max   89      ║
║ 5   Jan   43      ║
║ 6   Susi  42      ║
║ 7   Chris 11      ║
║ 8   Noa   9       ║
║ 9   Sisi  4       ║
╚═══════════════════╝

ここで、探しているデータに基づくサブセットが必要です。たとえば、私は適切な場所を探しています。私の結果では、Jan のレコードだけでなく、Jan の前の 2 つのレコードと Jan の後ろの 2 つのレコードも必要です。したがって、次の結果セットがあります。

╔═══════════════════╗
║ id++ name score   ║
╠═══════════════════╣
║ 3   Bill  99      ║
║ 4   Max   89      ║
║ 5   Jan   43      ║
║ 6   Susi  42      ║
║ 7   Chris 11      ║
╚═══════════════════╝

それは私が得たSQLです:

select @a:= id from quiz.score where username = 'Jan'; 
set @i=0;
SELECT @i:=@i+1 as Platz, s.* 
FROM quiz.score s where id BETWEEN @a-5 AND @a+5 
order by points desc;

ここでの問題は、それ@aidレコードの . 計算値を使用する方法はあります@i:=@i+1か?

どうもありがとうございました。

4

3 に答える 3

1

あなたが望むものは完全には明らかではありませんが、制限の創造的な使用が役立つかもしれません:

Set @i = 0;

Select
  (@i := @i + 1) + 2 place,
  s.*
From
  quiz_score s
Order By
  quality Desc
Limit 
  2, 5;

Example Fiddle

于 2013-10-06T17:52:32.627 に答える
1

私はあなたのための実用的な解決策を持っています. WHERE主なポイントは、句内の変数をインクリメントすることでした。

以下のコードは 7 行を表示します。「Jan」の下に 3 行、「Jan」自体、およびその後に 3 行です。

SET @i=0;

SELECT @n:=id, @s:=points FROM Score c WHERE c.username='Jan' ORDER BY points DESC;
SELECT (@i:=@i+1) FROM Score c WHERE c.id <> @n AND c.points <= @s;
SELECT (@i:=@i+1) FROM Dual;

SET @k=0;

SELECT s.* FROM Score s WHERE (@k:=@k+1) >= @i-3 AND @k<= @i+3  ORDER BY points DESC;

SQL フィドル

説明が必要な場合はお知らせください。

于 2013-10-07T18:05:49.527 に答える