mysql - SQL变量赋值和比较逻辑

标签 mysql mysql-variables

我正在研究以下 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

日志表的位置如下:

+----+-----+
| 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变量逻辑吗?谢谢!

最佳答案

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

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

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

等等...

关于mysql - SQL变量赋值和比较逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59095608/

相关文章:

java - 如何检索最大 id 值并存储在 int 变量中?

mysql - 如果负数 DATE_ADD() 相同,那么 MySQL 的 DATE_SUB() 函数有什么意义?

mysql - 如何在MySQL中对具有相同权重的记录进行排序

mysql - 同一查询的 where 子句中的别名值

mysql - 如何判断我的表是什么范式

mysql - 跟踪数据库中的更改

MySql 声明和选择变量的使用

php - 确定一段时间内的操作 PHP MySQL

mysql - 我是否正确计算了 MySQL 数据库的最大连接限制?