我正在使用mysql循环概念并使我的查询执行多次,期望多行的结果..
我的查询是:
DELIMITER $$
CREATE FUNCTION getActiveLife(endTime INT) RETURNS INT
BEGIN
DECLARE x INT;
DECLARE y INT;
DECLARE c1 INT;
SET x = endTime;
SET y = 4;
sloop:LOOP
SELECT count(*) INTO c1 FROM `accounts` where (`life` != 'EXPIRED') and (`lifeEnd` <= x );
IF y > 0 THEN
SET x = x-3600;
SET y = y - 1;
ELSE
LEAVE sloop;
END IF;
END LOOP;
RETURN c1;
END $$
DELIMITER ;
我实际上是想把结果从现在开始持续4个小时....它已经成功执行但是当我在下面调用它时
SELECT getActiveLife(1368193391)...
它给了我一条价值为1的记录......不知道这意味着什么......
因为我执行时
SELECT count(*) INTO c1 FROM `accounts` where (`life` != 'EXPIRED') and (`lifeEnd` <= 1368193391 );
它让我算作4 ...
所以我期待loop1的4,loop2的2,以及表格式等等。
如果我出错了或遗失了某些东西,请纠正我......
我期待的是:
Result:
4 - row1
2 - row2
1 - row3
以任何形式
谢谢。
答案 0 :(得分:1)
您的函数只返回一个值(return c1
)。它返回循环中的最后一个值。
在MySQL中,函数不返回表。如果您想要四行,则需要执行查询。或者,您可以将所有值连接成一个字符串,然后返回。你想要这个功能做什么?
答案 1 :(得分:0)
我相信这个查询可以满足您的需求:
SELECT
SUM(1) AS `endtime_count`,
SUM(IF(`lifeEnd` <= (? - (1 * 3600)), 1, 0)) AS `endtime_minus_1hour_count`,
SUM(IF(`lifeEnd` <= (? - (2 * 3600)), 1, 0)) AS `endtime_minus_2hour_count`,
SUM(IF(`lifeEnd` <= (? - (3 * 3600)), 1, 0)) AS `endtime_minus_3hour_count`,
SUM(IF(`lifeEnd` <= (? - (4 * 3600)), 1, 0)) AS `endtime_minus_4hour_count`
FROM `accounts`
WHERE
`life` <> 'EXPIRED'
AND `lifeEnd` <= ?
这里我们只使用IF
语句来总结您要查找的计数。请注意,?
表示您要查询的结束时间值。
这将返回包含所有值的单行。