首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL极限之和

MySQL极限之和
EN

Stack Overflow用户
提问于 2011-11-02 07:24:32
回答 4查看 2.2K关注 0票数 0

我想限制我的SELECT结果在mySQL之和。例如,这是我的桌子:

代码语言:javascript
复制
(id, val)

数据条目:(1,100)、(2,300)、(3,50)、(4,3000)

我希望选择第一个k条目,这样这些条目中的val之和就足以使其达到M。例如,我希望找到M= 425的条目。结果应该是(1,100),(2,300),(3,50)。

如何在mysql选择查询中做到这一点?

EN

回答 4

Stack Overflow用户

发布于 2011-11-02 07:35:34

试试这个变体-

代码语言:javascript
复制
SET @sum = 0;
SELECT id, val FROM (
  SELECT *, @sum:=@sum + val mysum FROM mytable2 ORDER BY id
) t
WHERE mysum <= 450;

+------+------+
| id   | val  |
+------+------+
|    1 |  100 |
|    2 |  300 |
|    3 |   50 |
+------+------+
票数 2
EN

Stack Overflow用户

发布于 2011-11-02 08:36:27

此存储过程可能有助于:

代码语言:javascript
复制
DELIMITER ;;

CREATE PROCEDURE selectLimitBySum (IN m INT)
BEGIN
DECLARE mTmp INT DEFAULT 0;
DECLARE idTmp INT DEFAULT 0;
DECLARE valTmp INT DEFAULT 0;
DECLARE doneLoop SMALLINT DEFAULT 0;
DECLARE crsSelect CURSOR FOR SELECT id, val FROM test3;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET doneLoop = 1;
OPEN crsSelect;
aloop: LOOP
    SET idTmp = 0;
    SET valTmp = 0;
    FETCH crsSelect INTO idTmp, valTmp;
    if doneLoop THEN
        LEAVE aloop;
    END IF;
    SELECT idTmp, valTmp;
    SET mTmp = mTmp + valTmp;
    if mTmp > m THEN
        LEAVE aloop;
    END IF;
END LOOP;
CLOSE crsSelect;
END ;;

DELIMITER ;

请随时根据需要更改表名或变量名。

票数 1
EN

Stack Overflow用户

发布于 2011-11-02 07:32:54

来自mysql参考手册:

限制子句可用于限制SELECT语句返回的行数。极限使用一个或两个数值参数,这两个参数都必须是非负整数常量(除非使用准备好的语句)。

所以你不能用限制你提议的方式。要实现您想要的结果,您需要使用您的应用程序(java、c、php或其他任何东西),逐行读取结果集,并在达到条件时停止。

或者你可以使用一个预先准备好的语句,但是无论如何,你不能有条件限制(它必须是一个常量),而且它不是你想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7976959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档