保存 SELECT 的顺序导致复杂查询
Save order of SELECT result in complex query
我需要先按 cost
对 selected_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" 操作。
我需要先按 cost
对 selected_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" 操作。