如何返回大于或小于指定值的行累积和?
<标题>表:id | count
-----------
1 | 30
2 | 10
3 | 5
4 | 20
5 | 15
<标题>查询:SELECT id, count
FROM table
ORDER BY id
HAVING SUM(count) < 50
<标题>返回行:id | count
-------------
1 | 30
2 | 10
3 | 5
<标题> 更新代码:public function query(){
switch($this->table){
case 'in_stock':
return "SELECT * FROM ".Init::$static['db'].".stock
WHERE id<=dynaccount.stock_first_available_id(".$this->value['num_stock'].", ".$this->value['product_id'].", ".(isset($this->att_arr['gid']) ? $this->att_arr['gid']:$_SESSION['gid']).")
ORDER BY time, id";
}
}
程序:
DELIMITER $$
DROP FUNCTION IF EXISTS `stock_first_available_id` $$
CREATE DEFINER=`dynaccount`@`localhost` FUNCTION `stock_first_available_id`(_running_total_limit INT, _product_id INT, _group_id INT) RETURNS INT
BEGIN
DECLARE _running_count INT default 0;
DECLARE _id INT;
DECLARE _current_id INT;
DECLARE _sum_count INT;
IF (SELECT COUNT(*) FROM stock WHERE group_id=_group_id && type=2 && product_id=_product_id) = 0 THEN
RETURN 0;
END IF;
DECLARE _cur CURSOR FOR SELECT id, count FROM stock WHERE group_id=_group_id && type=2 && product_id=_product_id ORDER BY time DESC, id DESC;
OPEN _cur;
read_loop: LOOP
FETCH _cur INTO _id, _sum_count;
SET _running_count = _running_count + _sum_count;
SET _current_id = _id;
IF _running_count > _running_total_limit THEN
LEAVE read_loop;
END IF;
END LOOP read_loop;
CLOSE _cur;
RETURN _current_id;
END $$
DELIMITER ;
错误:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE _cur CURSOR FOR SELECT id, count FROM stock WHERE group_id=_group_id && ' at line 12
标题>标题>标题>标题>
以下查询:
SELECT * FROM
(SELECT id,
count,
@running_count := @running_count + count AS Counter
FROM sumtest, (SELECT @running_count := 0) AS T1 ORDER BY id) AS TableCount
WHERE TableCount.Counter < 50;
产生结果:
id count Counter
1 30 30
2 10 40
3 5 45
我把你的表复制到MySql中,并把它命名为"sumtest"。请用您的表名替换。
实际上,我们按id顺序计算出运行总数,然后将其用作子查询。
那么这个查询:
SELECT id,
count,
@running_count := @running_count + count AS Counter
FROM sumtest, (SELECT @running_count := 0) AS T1
ORDER BY id
生产:
id count Counter
1 30 30
2 10 40
3 5 45
4 20 65
5 15 80
因此,通过在此执行另一次选择,选择计数器小于所需总和的所有行就变得很简单了。
编辑:下面是一个带有游标的示例。我刚刚为您抛出了这个函数(注意我的表称为sumtest,我的帐户是默认的root@localhost):
DELIMITER $$
DROP FUNCTION IF EXISTS `Test_Cursing` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `Test_Cursing`(_running_total_limit INT) RETURNS int
BEGIN
/* Why am I on StackOverflow at 01:41 on New Years Day. Dear oh dear, where's the beer? */
DECLARE _running_count INT default 0;
DECLARE _id INT;
DECLARE _current_id INT;
DECLARE _sum_count INT;
DECLARE _cur CURSOR FOR SELECT id, count FROM sumtest ORDER BY id;
OPEN _cur;
read_loop: LOOP
FETCH _cur INTO _id, _sum_count;
SET _running_count = _running_count + _sum_count;
IF _running_count > _running_total_limit THEN
LEAVE read_loop;
END IF;
SET _current_id = _id;
END LOOP;
CLOSE _cur;
RETURN _current_id;
END $$
DELIMITER ;
这样调用:
SELECT Test_Cursing(50);
将返回id = 3——也就是说,在达到运行总限制之前的最后一个id。然后,您可以使用以下命令:
SELECT * FROM sumtest WHERE id <= Test_Cursing(50);
返回:
id count
1 30
2 10
3 5