gpt4 book ai didi

MYSQL SELECT优化(简单)

转载 作者:可可西里 更新时间:2023-11-01 08:55:05 26 4
gpt4 key购买 nike

我有一个从大型数据库中挑选出特定行/列的查询。假设返回的值为“53”。

我需要得到:

1. The row that is 3000 rows above this value.
2. The row that is 3000 rows below this value.

如果结果只比该值高出 2000 行,那么我需要将差异添加到第二个查询中。

例。

1. Find 3000th value up (turns out that only 2000 values are present)
2. Find 4000th value down.

这是我的做法(这是在存储过程中):

SET @s1 = CONCAT('INSERT INTO List1(STD)  SELECT t1.STD FROM ',t1,' AS t1 USE INDEX(STD)   WHERE   t1.STD < ',inp1,' order by STD DESC limit ', inp2);

PREPARE stmt FROM @s1;
EXECUTE stmt;


SET @lim = inp2+(inp2-(SELECT FOUND_ROWS()));
SET @s2 = CONCAT('INSERT INTO List1(STD) SELECT t1.STD FROM ',t1,' AS t1 USE INDEX(STD) WHERE t1.STD >=', inp1,' order by STD ASC limit ?');

PREPARE stmt FROM @s2;
EXECUTE stmt USING @lim;

SET @minSD1 = (SELECT MIN(STD) FROM List1);
SET @maxSD1 = (SELECT MAX(STD) FROM List1);

这似乎非常迂回...没有更好的方法吗?

此外,如果不创建另一个存储过程(使用 PREPARE 关键字),真的没有办法在存储过程中使用可变表名吗?

最佳答案

在 SQL 中,“给定点上方/下方 3000 行”的概念仅存在于有序结果集的上下文中,并且未在数据库中定义。除非有一个基于键的算法过程来确定给定点的“上方/下方 n 行”是什么,否则您将无法实际读取行和计数,这就是您的解决方案似乎要尝试的。我没有验证它是否确实按照您的要求执行,但是这种方法或基于游标和计数行的方法是完成此操作的唯一方法。

关于MYSQL SELECT优化(简单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6272051/

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