假设我们有这种关系:
╔═══════════════════╗
║ 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 ║
╚═══════════════════╝现在,我需要一个基于我正在搜索的数据的子集。例如,我在寻找菲斯的地方。在我的结果中,我需要的不仅仅是简的记录,我需要的是简之前的两张唱片,以及简后面的两张唱片。因此,我有以下结果:
╔═══════════════════╗
║ 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
非常感谢你的帮助。
发布于 2013-10-08 13:33:51
如果您不需要输出中的排名(从您的评论和喜欢的答案中可以看出,您不需要),您可以简单地将最接近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;(请注意,由于样本数据集太小,所以我将结果LIMITed为一月之前的两个记录和一月之后的两个记录。)
发布于 2013-10-07 18:05:49
我有个解决办法给你。主要是在WHERE子句中增加变量。
下面的代码显示7行:在“Jan”下面3行,“Jan”本身下3行,后面显示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 Fiddle
如果需要澄清,请告诉我。
https://stackoverflow.com/questions/19211700
复制相似问题