gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:27:50 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

<小时/>

注意:查询中用户定义变量的行为不能得到保证,MySQL 引用手册对此发出了警告。但尽管有这个警告,我们确实在 MySQL 5.1 和 5.5 中观察到了可重复的行为。

在您给出的示例中,根本不清楚为什么需要内联 View (又名 派生表,在 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 处理内联 View 的方式,内联 View 查询在外部查询之前运行。这不能保证行为,并且可能会在将来的版本中更改(它可能已经5.6 中更改)

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

... ON booking (cost)

这可能允许 MySQL 使用该索引按顺序返回行并避免“使用文件排序”操作。

关于mysql - 在复杂查询中保存 SELECT 结果的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com