我需要先selected_booking
按cost
排序,然后将索引i
分配给每一行。我的变体没有正常工作(外部SELECT打破了顺序):
SELECT (@i:=@i + 1) AS i, selected_booking.*
FROM (SELECT * FROM booking ORDER BY cost DESC) AS selected_booking;
在做外部选择时,有没有办法保存内部选择的顺序?
答案 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"操作