Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 组上的行编号不正确_Mysql - Fatal编程技术网

Mysql 组上的行编号不正确

Mysql 组上的行编号不正确,mysql,Mysql,谢谢你帮我学习mysql 我试图动态生成行号,只有当组中有新记录时(对于给定列),行号才会增加。我的代码在某种程度上是有效的——它会在应该的时候改变,但是值都是错误的 我有一个名为fruits的表,其中只有一列(varchar)名为preference。按此顺序有九(9)条记录: Apples Pears Apples Oranges Bananas Pears Oranges Apples Bananas 这与中提出的挑战(t-index)相同,但该解决方案(我认为)使用了一个新的mysql

谢谢你帮我学习mysql

我试图动态生成行号,只有当组中有新记录时(对于给定列),行号才会增加。我的代码在某种程度上是有效的——它会在应该的时候改变,但是值都是错误的

我有一个名为
fruits
的表,其中只有一列(
varchar
)名为
preference
。按此顺序有九(9)条记录:

Apples
Pears
Apples
Oranges
Bananas
Pears
Oranges
Apples
Bananas
这与中提出的挑战(t-index)相同,但该解决方案(我认为)使用了一个新的
mysql
Window
函数,该函数仅在
mysql
v8
中可用,我的web主机不支持该函数(因为
CPanel
还不支持)

这是我的密码

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

@row\u num=CASE…
中的
=
正在将
@row\u num
CASE
表达式的结果进行比较,表达式返回
1
表示真,返回
0
表示假。您应该在那里使用
:=
赋值

您还将承担
案例
错误的后果。如果与
@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

@row_num=CASE…
中的
=
正在将
@row_num
CASE
表达式的结果进行比较,该表达式返回
1
为真,返回
0
为假。您应该在那里使用
:=
赋值

您还将承担
案例
错误的后果。如果与
@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

谢谢Barmar,我明白你说的缺少赋值运算符的意思了。但是代码并没有给出预期的解决方案-RowNum应该保持与上次记录相同的结果。preference=@currFruit,所以我修改了您的代码(见下文),但出于某种原因,第一个RowNum是2(应该是1)。您的问题是数字应该递增:“苹果应该是1,2,3”对不起,巴尔马,我错了。您的代码几乎可以工作(在删除+1之后),并将其改为“ELSE@row_num+1”,但第一条记录的RowNum为“2”(应为“1”)。如果您希望第一条RowNum为1,则将其初始化为
@row_num:=0
。感谢Barmar,我明白您对缺少赋值运算符的意思。但是代码并没有给出预期的解决方案-RowNum应该保持与上次记录相同的结果。preference=@currFruit,所以我修改了您的代码(见下文),但出于某种原因,第一个RowNum是2(应该是1)。您的问题是数字应该递增:“苹果应该是1,2,3”对不起,巴尔马,我错了。您的代码几乎可以正常工作(在删除+1后)并将其改为“ELSE@row_num+1”,但第一条记录的RowNum为“2”(应为“1”)。如果希望第一条RowNum为1,则将其初始化为
@row_num:=0