我想限制我的SELECT结果在mySQL之和。例如,这是我的桌子:
(id, val)数据条目:(1,100)、(2,300)、(3,50)、(4,3000)
我希望选择第一个k条目,这样这些条目中的val之和就足以使其达到M。例如,我希望找到M= 425的条目。结果应该是(1,100),(2,300),(3,50)。
如何在mysql选择查询中做到这一点?
发布于 2011-11-02 07:35:34
试试这个变体-
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 |
+------+------+发布于 2011-11-02 08:36:27
此存储过程可能有助于:
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 ;请随时根据需要更改表名或变量名。
发布于 2011-11-02 07:32:54
来自mysql参考手册:
限制子句可用于限制SELECT语句返回的行数。极限使用一个或两个数值参数,这两个参数都必须是非负整数常量(除非使用准备好的语句)。
所以你不能用限制你提议的方式。要实现您想要的结果,您需要使用您的应用程序(java、c、php或其他任何东西),逐行读取结果集,并在达到条件时停止。
或者你可以使用一个预先准备好的语句,但是无论如何,你不能有条件限制(它必须是一个常量),而且它不是你想要的。
https://stackoverflow.com/questions/7976959
复制相似问题