0

我正在研究以下mysql:

select num, @record, 
case 
    when @record = num then @count:=@count+1
    when @record <> @record:=num then @count:=1 end as n
from 
    Logs ,(select @count:=0,@record:=(SELECT num from Logs limit 0,1)) r

Logs 表的位置如下:

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

查询的输出如下:

 |num | @record | n   |
 ----------------------
 | 1  |     "1" | 1.0 |
 | 1  |     "1" | 2.0 | 
 | 1  |     "1" | 3.0 |
 | 2  |     "1" | 1.0 |
 | 1  |     "2" | 1.0 | 
 | 2  |     "1" | 1.0 | 
 | 2  |     "2" | 2.0 |

对于第二行和第三行,我很难理解是如何得出的。例如,在 row_1 (Id = 1) 中@record = Num,为什么 n = 1 而不是 2?在 row_3 中 @record = Num,为什么 n = 3 而不是 2?

是否只有一个 @record 全局变量?还是每个 num 都有自己的 @record 变量?

谁能帮我理解@sql变量逻辑?谢谢!

4

2 回答 2

1

MySQL首先评估JOIN,即在处理任何行之前@count=1@record=1第一行的值与 1 ( )num相同。@recordn@count+1

第二行和第三行遵循相同的逻辑结果值 2 和 3。

第四行重置@count并将新的num放入@record

等等...

于 2019-11-28T20:37:06.723 回答
0

n 列的值来自@count,而不是@record。@record 用于在 num 更改时将 @count 重置为 1

于 2019-11-28T20:37:32.483 回答