首页 > 解决方案 > 组上的行编号不正确

问题描述

并感谢您帮助我学习 mysql。

我正在尝试动态生成仅在组中有新记录时才会增加的行号(对于给定的列)。我的代码有点工作 - 它应该在它应该改变的时候改变,但值都是错误的。

我有一个表fruits,只有一列 ( varchar) 调用preference。它按以下顺序有九 (9) 条记录:

Apples
Pears
Apples
Oranges
Bananas
Pears
Oranges
Apples
Bananas

它与Increment Row Number on Group中提出的相同挑战(the t-index),但该解决方案使用(我认为)一个仅在(我认为)中可用的新功能,我的网络主机不支持(因为还没有)支持)。mysql Windowmysql v8CPanel

这是我的代码...

SET @row_num=1,@currFruit='';

SELECT @row_num=CASE WHEN fruit.preference=@currFruit 
                    THEN @row_num 
                    ELSE @row_num:=@row_num+1 END AS 'RowNum', 
    preference, @currFruit:=fruit.preference    
FROM fruit
ORDER BY fruit.preference;

结果显示动态生成的行号应该在什么时候发生变化,但初始值是错误的,它不应该重置每个组,它们不保持递增(苹果应该是 1、2、3),(香蕉应该是1, 2), (橙子 1,2), (梨子 1,2)

这是不正确的输出....

@RowNum  preference         @currFruit:=fruit.preference
0        Apples             Apples
1        Apples             Apples
1        Apples             Apples
0        Bananas            Bananas
1        Bananas            Bananas
0        Oranges            Oranges
1        Oranges            Oranges
0        Pears              Pears
1        Pears              Pears

标签: mysql

解决方案


=in与表达式的结果@row_num = CASE ...进行比较,表达式返回true 和false。你应该在那里分配。@row_numCASE10:=

你也有CASE错误的后果。当它与@currFruit您应该添加1相同时,您应该将其设置回1。

SELECT @row_num := CASE WHEN fruit.preference=@currFruit 
                    THEN @row_num + 1
                    ELSE 1 END AS 'RowNum', 
    preference, @currFruit:=fruit.preference    
FROM fruit
ORDER BY fruit.preference

演示


推荐阅读