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 之前的两条记录和 Jan 之后的两条记录。所以我有以下结果集:

╔═══════════════════╗
║ 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;

这里的问题是@a记录的问题id。有没有办法使用计算值@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

如果您不需要输出中的排名(并且从您的评论和喜欢的答案中可以看出您不需要),您可以简单地结合最接近 Jan 分数的测验分数:

查询(此处为 SQL Fiddle):

-- XXX this assumes `scores`.`username` is UNIQUE !
SELECT * FROM (
    -- Get those who scored worse (or tied)
    (    SELECT s.*
           FROM scores s
     CROSS JOIN (SELECT score FROM scores WHERE username = 'Jan') ref
          WHERE s.score <= ref.score AND username <> 'Jan'
       ORDER BY s.score DESC
          LIMIT 2)
    UNION
    -- Get our reference point record
    (SELECT s.* FROM scores s WHERE username = 'Jan')
    UNION
    -- Get those who scored better
    (    SELECT s.*
           FROM scores s
     CROSS JOIN (SELECT score FROM scores WHERE username = 'Jan') ref
          WHERE s.score > ref.score AND username <> 'Jan'
       ORDER BY s.score ASC
          LIMIT 2)
) slice
ORDER BY score ASC;

(请注意,我将结果限制为一月之前的两条记录和一月之后的两条记录,因为您的样本数据集太小了。)

上述组成查询中的括号是允许LIMIT 和 UNION 一起工作的必要条件。然后,最外面的查询让我们对 UNION 的结果进行排序

于 2013-10-08T13:33:51.313 回答
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 回答