mysql中的分配顺序是什么?
set @rownum := 0;
explain select actor_id, first_name, @rownum as rownum
from actor
where @rownum <= 1
order by first_name, LEAST(0, @rownum:=@rownum + 1);
答案 0 :(得分:0)
对于在此查询中查看的其他任何人,吐出2行,例如给出2个行号
+----------+-------+
| sudentid | fname |
+----------+-------+
| 101 | NULL |
| 103 | NULL |
| 112 | NULL |
+----------+-------+
3 rows in set (0.00 sec)
查询产生
+----------+-------+--------+
| sudentid | fname | rownum |
+----------+-------+--------+
| 101 | NULL | 1 |
| 103 | NULL | 2 |
+----------+-------+--------+
2 rows in set (0.00 sec)
说明计划
+------+-------------+---------+------+---------------+------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------+------+---------------+------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | student | ALL | NULL | NULL | NULL | NULL | 8 | Using where; Using temporary; Using filesort |
+------+-------------+---------+------+---------------+------+---------+------+------+----------------------------------------------+
1 row in set (0.00 sec)
解释计划与我的预期相符,即最后的订单(https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations/)
但是似乎发生的事情是,因为order by递增了select中使用的变量,所以存在另一个按实际事件顺序调用的where子句,该子句未反映在解释计划中(我认为这反映了LOGICAL事件的顺序)。
我不知道OP在这里要做什么(或者如果结果不正确),但这不是通常在版本8之前分配行号的方式。