MySQL RowNumber的问题

zjcxc 2016-11-08 10:50:08
在 MySQL中生成 RowNumber,发现这个异常的结果
第一个的结果不是预想的:排序是预想的,但生成的 row_id 不是
第二个结果是正常的,排序涉及的数据与查询一一样
第一个套层子查询封闭一下也是正确的,不知道为啥

set @i:=0;
select a.*, b.*, (@i:=@i+1) as row_id
from(select 1 as id union all select 2) a
left join( select 1 as id ) b on a.id=b.id
order by b.id;
/* 结果
+----+------+--------+
| id | id | row_id |
+----+------+--------+
| 2 | NULL | 2 |
| 1 | 1 | 1 |
+----+------+--------+
*/

set @i:=0;
select a.*, (@i:=@i+1) as row_id
from(select 1 as id union all select null) a
order by id;
/* 结果
+------+--------+
| id | row_id |
+------+--------+
| NULL | 1 |
| 1 | 2 |
+------+--------+
*/



...全文
329 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2016-12-07
  • 打赏
  • 举报
回复
看来无解,只能算了
LongRui888 2016-11-08
  • 打赏
  • 举报
回复
从上面实验来看,是先计算row_id,然后再最后排序。 另外,还有一种变化,就是 如果希望以一定的顺序编号,可以在 表内部排序,比如:
mysql> set @i:=0;
Query OK, 0 rows affected (0.03 sec)

mysql> select a.*, (@i:=@i+1) as row_id
    -> from
    -> (
    ->  select a.*,b.id as bid
    ->  from
    ->  (select 1 as id union all select 2) a
    ->  left join( select 1 as id ) b on a.id=b.id
    ->  order by b.id
    -> )a;
+----+------+--------+
| id | bid  | row_id |
+----+------+--------+
|  2 | NULL |      1 |
|  1 |    1 |      2 |
+----+------+--------+
2 rows in set (0.03 sec)
致命的西瓜 2016-11-08
  • 打赏
  • 举报
回复
我也觉得没什么问题,路过
rucypli 2016-11-08
  • 打赏
  • 举报
回复
没啥异常吧 order by是在row_id之后执行的
第一个套层子查询封闭一下也是正确的,不知道为啥
这句话什么意思
zjcxc 2016-11-08
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
没啥异常吧 order by是在row_id之后执行的
第一个套层子查询封闭一下也是正确的,不知道为啥
这句话什么意思
子查询的问题参考前面的 ORDER BY 在 row_id 这个我也知道,但这只是现象,并没有说原因 我想知道的是原因和有没有不用子查询的避免的办法 或者说,SELECT 列表的处理和 ORDR BY 的顺序,到底是那些因素决定或控制的
zjcxc 2016-11-08
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
从上面实验来看,是先计算row_id,然后再最后排序。 另外,还有一种变化,就是 如果希望以一定的顺序编号,可以在 表内部排序,比如:
mysql> set @i:=0;
Query OK, 0 rows affected (0.03 sec)

mysql> select a.*, (@i:=@i+1) as row_id
    -> from
    -> (
    ->  select a.*,b.id as bid
    ->  from
    ->  (select 1 as id union all select 2) a
    ->  left join( select 1 as id ) b on a.id=b.id
    ->  order by b.id
    -> )a;
+----+------+--------+
| id | bid  | row_id |
+----+------+--------+
|  2 | NULL |      1 |
|  1 |    1 |      2 |
+----+------+--------+
2 rows in set (0.03 sec)
这种也就是我说的再嵌套一层子查询,但问题是为什么直接的会有问题, 而且后面我没熟了, INNER JOIN 也会有这种问题 现在是不想多做一层嵌套,想知道原因看有没有避免的办法 这个是做 T-SQL 转 MySQL 时发现的问题,不想把转换工作弄得更复杂了,毕竟 T-SQL 的复杂度本来就高,再考虑这种特殊情况的处理,那转换的程序就更头痛

56,867

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧