保存 SELECT 的顺序导致复杂查询

Save order of SELECT result in complex query

我需要先按 costselected_booking 进行排序,然后将索引 i 分配给每一行。我的变体无法正常工作(外部 SELECT 破坏了顺序):

SELECT (@i:=@i + 1) AS i, selected_booking.* FROM (SELECT * FROM booking ORDER BY cost DESC) AS selected_booking;

有没有办法在做外选的时候保存内选的顺序?

问:外选时有没有办法保存内选顺序?

A:在外部查询中没有 ORDER BY 子句,MySQL 可以自由选择 return 行的任意顺序。

如果您希望内联视图(派生 table)中的行按特定顺序 returned,您需要在外部查询中指定...您需要添加外部查询的 ORDER BY 子句。


注意:无法保证 查询中用户定义变量的行为,MySQL 参考手册对此提出警告。但是尽管有这个警告,我们确实在 MySQL 5.1 和 5.5.

中观察到 repeatable 行为

在你给出的例子中,你为什么需要内联视图(又名派生table,在MySQL venacular) .

这个查询似乎 return 您似乎想要的结果:

 SET @i = 0 ;
 SELECT @i:=@i+1 AS i 
      , b.*
   FROM booking b
  ORDER BY b.cost DESC ;

或者,您可以在单个语句中执行此操作,并在查询中初始化 @i,而不是单独的 SET 语句。

 SELECT @i:=@i+1 AS i 
      , b.*
   FROM booking b
   JOIN (SELECT @i:=0) i
  ORDER BY b.cost DESC

(此初始化再次起作用,因为 MySQL 处理内联视图的方式,内联视图查询在外部查询之前 运行。这不是保证的行为,并且可能未来版本中的更改(它可能已经在 5.6 中更改)

注意:为了提高此查询的性能,如果 suitable 索引可用 cost 作为前导列,例如

... ON booking (cost)

这可能允许 MySQL 按顺序将该索引用于 return 行并避免 "Using filesort" 操作。