Php MySQL:选择最后N行,求和小于数字

Php MySQL:选择最后N行,求和小于数字,php,mysql,sum,having,Php,Mysql,Sum,Having,我有一张大桌子: +------+---------+-----+-----+-------+------+---------+ |ticker|data_date|price|count|oper_id|ext_nr|oper_summ| +------+---------+-----+-----+-------+------+---------+ |SBER |2015-08..|70.00|15 |0 |251528|1050.00 | |AFLT |2015-08..

我有一张大桌子:

+------+---------+-----+-----+-------+------+---------+ |ticker|data_date|price|count|oper_id|ext_nr|oper_summ| +------+---------+-----+-----+-------+------+---------+ |SBER |2015-08..|70.00|15 |0 |251528|1050.00 | |AFLT |2015-08..|30.00|5 |0 |251525|150.00 | |SBER |2015-08..|69.00|10 |1 |251521|690.00 | |SBER |2015-08..|71.00|15 |1 |251513|1065.00 | |SBER |2015-08..|72.00|15 |0 |251512|1080.00 | data_date format: 2015-01-05 09:59:59 UNIQUE KEY `idx_ticker_ext_nr` (`ticker`,`ext_nr`) 我需要选择最后N行,其中sumoperu_summ将小于10000

我发现了类似的话题:

但在我的条件下无法使它工作

找到了一个解决方案:

SET @msum := 0;
select t1.* from 
(select m.*, 
(@msum := @msum + m.oper_summ) as cumul_oper_summ from jos_fintools_data m order by m.data_date DESC ) 
t1 where t1.cumul_oper_summ <= 10000;
积分归toomanyredirects:

使用变量:

SELECT o.*
FROM (SELECT O.ext_nr, O.price, O.count, O.oper_summ,
             (@os := @os + oper_summ) as RunningTotal
      FROM Table1 O CROSS JOIN
           (SELECT @os := 0) params
      ORDER BY data_date desc
     ) o
HAVING RunningTotal <= 10000;

注意:您需要按子查询中的某些内容排序。我不确定正确的列是什么。我最好的猜测是日期列。

告诉我们到目前为止您有什么,至少这会给我们一个提示:我需要找到最后一行的总和小于2150;在我的示例中,它将是prices:71和72 sumoper_summ=2145<2150我们在这里帮助您不提供一些代码。让我们看看你做了什么,我们会尽力帮助你。编辑你的问题,而不是在评论中写重要信息选择O.ext\u nr、O.price、O.count、O.oper\u summ,从表1中选择sumoper\u summ,其中ext\u nr Michael:编辑你的问题,并添加任何额外的细节。它作为一个注释是不可读的。。。我需要对整个列求和,但随后我添加等于oper|u SUMM的和的排序结果:++---+----+----+----+----+----+----+----+----+----+----+----ext|u nr | price | count | oper|u SUMM RunningTotal |+----+----+----+----+----+----+----2515424031 | 40.40500 | 5 | 202.02500 | 202.025;和什么?。。
SET @msum := 0;
select t1.* from 
(select m.*, 
(@msum := @msum + m.oper_summ) as cumul_oper_summ from jos_fintools_data m order by m.data_date DESC ) 
t1 where t1.cumul_oper_summ <= 10000;
SET @msum := 0;
select t1.* from 
(select m.*, 
(@msum := @msum + m.oper_summ) as cumul_oper_summ from jos_fintools_data m order by m.data_date DESC ) 
t1 where t1.cumul_oper_summ <= 10000;