Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql查询速度-每3行选择最大值_Php_Mysql_Performance - Fatal编程技术网

Php mysql查询速度-每3行选择最大值

Php mysql查询速度-每3行选择最大值,php,mysql,performance,Php,Mysql,Performance,我有一张保存价格信息的桌子。我需要选择每三行的最大值。例如: Table `daily_high` ____ _______ | ID | HIGH | | 1 | 24.65 | | 2 | 24.93 | | 3 | 26.02 | | 4 | 25.33 | | 5 | 25.16 | | 6 | 25.91 | | 7 | 26.05 | | 8 | 28.13 | | 9 | 27.07 | |____|_______| Desired output to n

我有一张保存价格信息的桌子。我需要选择每三行的最大值。例如:

Table `daily_high`
 ____ _______
| ID | HIGH  |
| 1  | 24.65 |
| 2  | 24.93 |
| 3  | 26.02 |
| 4  | 25.33 |
| 5  | 25.16 |
| 6  | 25.91 |
| 7  | 26.05 |
| 8  | 28.13 |
| 9  | 27.07 |
|____|_______|


Desired output to new table (ID will be auto-increment so don't assume an association exists between this ID 1 and the daily_high ID 1:
 ____ ___________
| ID | 3MaxHIGH  |
|____|___________|
| 1  | 26.02     |
| 2  | 25.91     |
| 3  | 28.13     |
|____|___________|
我想比较IDs1、2和3以确定它们之间的高值。一旦我比较了1-3,我想从4到6,再到7到9,等等,直到我对表中包含的所有值进行了比较,目前大约有400000个值。我已经编写了使用

从日高选择maxHIGH作为dh1加入从日高选择maxHIGH,其中id>=dh1且id 这是可行的,但速度非常慢。我已经尝试使用SELECT语句,在该语句中,我标识要显示的列值,这意味着在查询的SELECT和FROM部分之间

我曾尝试使用JOIN将所有3行连接到同一个表中进行比较,但速度太慢了。我所说的慢是指不到10秒就可以收集20行的信息。这意味着该查询在9.65879893303秒内分析了60行20组3。我没有编出来,我用microtime来计算它

有人对比我更快的代码有什么建议吗

请记住,我的实际表格与我上面发布的表格不同,但它的概念是相同的


谢谢你的帮助

如果你认为它是连续的,你可以这样做

SELECT floor(id/3) as range, max(HIGH) FROM daily_high GROUP BY range;
为什么不使用运算符对聚合进行分组:

SELECT (id-1) DIV 3 + 1 AS ID, MAX(high) AS 3MaxHIGH 
FROM daily_high 
GROUP BY (id-1) DIV 3
这个查询给出了相同的结果

ID  3MaxHIGH
1   26.02
2   25.91
3   28.13
我无法运行您的查询,我相信这一个更快

UPD:要确保您的范围具有有效的组,请使用以下查询:

select id, high, (id-1) div 3 + 1 from daily_high
结果:

id  high    (id-1) div 3 + 1
1   24.65   1
2   24.93   1
3   26.02   1
4   25.33   2
5   25.16   2
6   25.91   2
7   26.05   3
8   28.13   3
9   27.07   3

用一个例子更全面地回答。下面的代码将执行我认为您想要的操作

SELECT FLOOR((row - 1) / 3), MAX(Sub1.high)
FROM (SELECT @row := @row + 1 as row, daily_high.*
FROM daily_high, (SELECT @row := 0) r) Sub1
GROUP BY FLOOR((row - 1) / 3) 
ORDER BY Sub1.ID

下面的查询在一个测试表上对我有效。也许不是最好的,但其他解决方案在我的测试表上失败了

这确实要求ID是连续的。同时也要确保在高速上加上一个指数

SELECT FLOOR(T1.Id/3)+1 AS Id, ROUND(GREATEST(T1.High, T2.High, T3.High),2) AS High FROM `daily_high` T1, `daily_high` T2, `daily_high` T3
WHERE T2.Id=T1.Id+1 
AND T3.Id=T2.Id+1
AND MOD(T1.Id, 3)=1

选择id的楼层除以3和最大高度,按id的楼层除以3进行分组。如果每3条记录都需要它,即使有间隙,那么前3条可能是13和7,那么您可能需要计算一个序列号并使用它。您的查询将给出id列-0,0,1,1,1,2,2。我并不奇怪您不能运行我的查询,我只是边走边键入它。它不是从我的脚本中复制和粘贴的。PHP变量和其他东西会让它变得毫无意义。我以前从未听说过或使用过DIV。我看到您的结果表中有一列在1、2和3的分组中重复1、1、1。这只是为了确保该范围内存在有效组而进行的更新的结果吗?谢谢这看起来要快得多。是的,我显示了这个检查查询,并检查结果以确保1,2,3被分组在一起,这要感谢id中的-1。否则,如果您不从id中减去1,您将分组1,2;然后是3,4,5;等您只需要在程序中使用第一个查询。实际上,DIV是无提示的除法。A分区B与FLOORA/B相同。在国际海事组织,单操作员分区比浮点操作员/+功能楼层快得多。
logic: if(id is divisible by 3, id/3-1, id/3)

select if(mod(id,3) = 0,floor(id/3)-1,floor(id/3)) as group_by_col , max(HIGH)
FROM daily_high GROUP BY group_by_col;