【发布时间】:2012-01-01 00:17:06
【问题描述】:
对于大于或小于指定值的行,如何返回累积和的行?
表:
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
【问题讨论】:
-
@mu,你是什么意思?是不是可以在mysql中做?
-
看看stackoverflow.com/questions/1135627/…。然后,您可以选择累计总和小于总数的所有行。
-
在 SQL 中计算大量行的运行总计通常效率低下(除非它们支持完整的
OVER子句)。我觉得可能有一种方法可以在 MySQL 中使用用户变量来合理有效地完成此要求。 -
@martin,你是什么意思?你能举一个
OVER子句的例子吗? -
@MartinSmith 是的,当然,MySql 不支持 over 子句真的很遗憾,因为它使这变得微不足道。否则你需要一个运行总数或(urghh)一个光标,我想。顺便说一句,祝 0b11111011100 一切顺利!
标签: mysql cumulative-sum