select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r /*where approverEuid = 'EU000000073'*/ ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 和 select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 的区别
时间: 2024-04-13 17:25:15 浏览: 130
这两个查询之间的区别在于子查询的位置不同。
在第一个查询中,子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 位于 `FROM` 子句中的表 `ga_mid.approver t` 的后面。
而在第二个查询中,子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 位于 `FROM` 子句中的表 `ga_mid.approver t` 的前面。
这个子查询的目的是初始化变量 `@num`、`@a`、`@b`、`@c`。这些变量在主查询中用于记录前一行的值,并在每一行进行比较,以确定是否需要递增 `@num`。
由于 MySQL 的执行顺序,子查询中的变量初始化操作会在主查询之前执行。因此,第一个查询中的子查询会在主查询之前初始化变量,而第二个查询中的子查询会在主查询之后初始化变量。
这种不同的初始化时机可能会导致结果集的排序不同,因为排序所依赖的变量值可能会受到初始化时机的影响。因此,这两个查询的结果可能是不同的。
如果你希望得到相同的排序结果,请将子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 放在主查询之前,以确保变量在主查询之前被正确初始化。
相关问题
select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r where approverEuid = 'EU000000073' ORDER BY id, approverEuid,startDate,enddate) t; 和 select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 的区别
这两个查询之间的区别在于排序的位置不同。
在第一个查询中,排序操作 `ORDER BY id, approverEuid,startDate,enddate` 是在主查询的最后进行的,即在筛选出 `approverEuid = 'EU000000073'` 的结果后进行排序。
而在第二个查询中,排序操作 `ORDER BY id, approverEuid,startDate,enddate` 是在子查询中进行的,然后在主查询中筛选出 `approverEuid = 'EU000000073'` 的结果。
这个区别可能会导致两个查询的结果集的排序顺序不同。在第一个查询中,先筛选出 `approverEuid = 'EU000000073'` 的结果,然后对这些结果进行排序。而在第二个查询中,先对整个结果集进行排序,然后再筛选出 `approverEuid = 'EU000000073'` 的结果。
因此,如果你只关心 `approverEuid` 为 `'EU000000073'` 的行,并且希望得到按照 `id, approverEuid, startDate, enddate` 排序的结果,那么第二个查询可能更符合你的需求。
请注意,在这两个查询中,排序操作是在开窗函数中使用的变量的基础上进行的。这些变量用于对结果集进行编号和比较,并作为开窗函数的一部分。这些排序操作可能会影响最终结果集的连续性。
select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r where approverEuid = 'EU000000073' ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 和 select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 的区别
这两个查询之间的区别在于是否添加了过滤条件 `where approverEuid = 'EU000000073'`。
在第一个查询中,通过在子查询的 `WHERE` 子句中添加了条件 `where approverEuid = 'EU000000073'`,限制了最终结果集中 `approverEuid` 列的值为 `'EU000000073'`。
而在第二个查询中,没有添加这个过滤条件,因此会返回整个结果集,其中包含所有不同的 `approverEuid` 值。
由于这个过滤条件的存在与否,两个查询的结果集可能会有所不同。第一个查询只返回满足条件的行,而第二个查询返回所有行。如果你只关心 `approverEuid` 为 `'EU000000073'` 的行,那么第一个查询可能更适合你的需求。
请注意,在这两个查询中,排序操作是在子查询中进行的,然后再通过外层查询将结果限制为 `approverEuid = 'EU000000073'` 的行。因此,排序的效果并不会受到过滤条件的影响。
阅读全文