在赋值和读取变量的时候可能在查询的不同阶段。
由于where和select在查询的不同阶段执行,所以看到查询到两条记录,这并不符合预期。
set @rownum:=0;
select actor_id,@rownum:=@rownum+1 as cnt from actor where @rownum<=1;
当引入了order by之后,会打印全部结果,这是因为order by 引入了文件排序,而where条件实在文件排序之前取值的。
加上order by之后的结果是返回了表中所有的记录:
set @rownum:=0;
select actor_id,@rownum:=@rownum+1 as cnt from actor where @rownum<=1 order by first_name;
解决这个问题的关键在于让变量的赋值和取值发生在执行查询的同一阶段。
最终解决方案:
set @rownum:=0;
select actor_id,@rownum:=@rownum+1 as cnt from actor where (@rownum:=@rownum+1)<=1;