gpt4 book ai didi

mysql - 使用 MySQL : how does it work? 对组中的行进行编号

转载 作者:行者123 更新时间:2023-11-30 22:57:03 24 4
gpt4 key购买 nike

有几篇关于如何使用 MySQL 对组内的行进行编号的好帖子,但实际代码是如何工作的?我不清楚 MySQL 在下面的代码中首先评估什么。

例如,将 @yearqt := yearqt as bloc 放在 IF() 调用之前会产生不同的结果,我不清楚 的作用>s1 子查询在初始化 @ 变量时:当 MySQL 运行数据行时,它们何时更新? order by 语句是否在 select 之前运行?

下面的代码为每个 yearqt 组选择三个随机记录。可能还有其他方法可以做到这一点,但问题与代码的工作方式有关,而不是我如何以不同的方式执行此操作或我是否可以更有效地执行此操作。谢谢。

 select * from (
select customer_id , yearqt , a ,
IF(@yearqt = yearqt , @rownum := @rownum + 1 , @rownum := 1) as rownum ,
@yearqt := yearqt as bloc
from
( select customer_id , yearqt , rand(123) as a from tbl
order by rand(123)
) a join ( select @rownum := 0 , @yearqt := '' ) s1
order by yearqt
) s2
where rownum <= 3
order by bloc

最佳答案

这个问题与引擎如何检索 SQL SELECT 查询结果有关。顺序大致如下:

  1. 计算解释计划
  2. 计算集合并使用计划的指令加入它们(FROM/JOIN 阶段)
  3. 应用WHERE子句
  4. 应用GROUP BY/HAVING子句
  5. 应用ORDER BY子句
  6. 投影阶段:返回的每一行都是有序的,现在可以“显示”。

所以,关于变量,你现在明白为什么有子查询来初始化它们了。此子查询仅在流程开始时评估一次。

在那之后,项目阶段似乎按照您决定的顺序处理每个选定的属性,这就是为什么将 @yearqt := yearqt as bloc 放在一个属性上会改变下一个属性的结果的原因/previous IF 语句。由于每行将被投影一次,这意味着您对变量所做的任何工作将完成与最终结果集中的行数一样多的次数。

关于mysql - 使用 MySQL : how does it work? 对组中的行进行编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25855499/

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