首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组内MySQL计数器

组内MySQL计数器
EN

Stack Overflow用户
提问于 2013-11-18 18:58:35
回答 1查看 1.1K关注 0票数 3

我想根据一个升序变量为组中的每一行添加一个计数器。我有一个解决方案,但如果组内的某个变量相等,则不起作用:

代码语言:javascript
复制
CREATE TABLE tb (
g CHAR(1)
, x  INTEGER
);

INSERT INTO tb (g, x)
VALUES
('a',1)
, ('a',2)
, ('a',10)
, ('b',1)
, ('b',1)
, ('b',10)
;

SELECT g,x, (SELECT COUNT(*)
           FROM tb b
           WHERE a.g = b.g
                 AND a.x > b.x
           ) + 1 AS counter
FROM tb a
;    

我得到的是:

代码语言:javascript
复制
--------------------
| g | x  | counter |
--------------------
| a |  1 |    1    |  
| a |  2 |    2    |  
| a | 10 |    3    |
| b |  1 |    1    |
| b |  1 |    1    |
| b | 10 |    3    |
--------------------

但我想知道:

代码语言:javascript
复制
--------------------
| g | x  | counter |
--------------------
| a |  1 |    1    |  
| a |  2 |    2    |  
| a | 10 |    3    |
| b |  1 |    1    |
| b |  1 |    2    |
| b | 10 |    3    |
--------------------

知道我怎么能解决这个问题吗?非常感谢你的暗示。

佐达诺

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-18 19:11:03

用户定义的变量在解决这个问题时变得很方便。这应该是可行的:

代码语言:javascript
复制
select g, x, counter from (
    select g, x,
        @counter := if (g = @prev_g, @counter + 1, 1) counter,
        @prev_g := g
    from tb, (select @counter := 0, @prev_g := null) init
    order by g, x
) s

如果您不介意第四列,那么可以安全地删除外部select。这将大大提高性能。

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

https://stackoverflow.com/questions/20055644

复制
相关文章

相似问题

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