查询中累积的总和



如何返回大于或小于指定值的行累积和?

<标题>表:
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 &amp;&amp; ' 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

相关内容

  • 没有找到相关文章

最新更新