在复杂查询中保存SELECT结果的顺序

时间:2015-01-19 23:47:15

标签: mysql sql select sql-order-by

我需要先selected_bookingcost排序,然后将索引i分配给每一行。我的变体没有正常工作(外部SELECT打破了顺序):

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

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

1 个答案:

答案 0 :(得分:1)

问:在进行外部选择时,有没有办法保存内部选择的顺序?

答:在外部查询中没有ORDER BY子句,MySQL可以按照它选择的任何顺序自由返回行。

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


注意:查询中用户定义变量的行为不是保证,MySQL参考手册警告这一点。但是,尽管有这种警告,我们确实在MySQL 5.1和5.5中观察到了可重复的行为。

在您给出的示例中,您根本不清楚为什么需要内联视图(在MySQL版本中也称为派生表)。

看起来这个查询会返回你想要的结果:

 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)

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

... ON booking (cost)

可能允许MySQL使用该索引按顺序返回行并避免使用"使用filesort"操作