首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于mysql计算列的sql显示分区

基于mysql计算列的sql显示分区
EN

Stack Overflow用户
提问于 2013-10-06 17:26:24
回答 2查看 344关注 0票数 1

假设我们有这种关系:

代码语言:javascript
复制
╔═══════════════════╗
║ 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       ║
╚═══════════════════╝

现在,我需要一个基于我正在搜索的数据的子集。例如,我在寻找菲斯的地方。在我的结果中,我需要的不仅仅是简的记录,我需要的是简之前的两张唱片,以及简后面的两张唱片。因此,我有以下结果:

代码语言:javascript
复制
╔═══════════════════╗
║ id++ name score   ║
╠═══════════════════╣
║ 3   Bill  99      ║
║ 4   Max   89      ║
║ 5   Jan   43      ║
║ 6   Susi  42      ║
║ 7   Chris 11      ║
╚═══════════════════╝

这就是我得到的sql:

代码语言:javascript
复制
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

非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-08 13:33:51

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

查询(SQL Fiddle在这里):

代码语言:javascript
复制
-- 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为一月之前的两个记录和一月之后的两个记录。)

为了允许限制和工会共同工作,需要在上面的组成查询中使用这些括号。然后,最外层的查询允许我们使用命令联盟的结果

票数 1
EN

Stack Overflow用户

发布于 2013-10-07 18:05:49

我有个解决办法给你。主要是在WHERE子句中增加变量。

下面的代码显示7行:在“Jan”下面3行,“Jan”本身下3行,后面显示3行。

代码语言:javascript
复制
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

如果需要澄清,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19211700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档