4

我正在使用 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...

所以我期待像 4 for loop1 ,2 for loop2 等等的表格格式。

如果我出错或遗漏了什么,请纠正我....

我期待类似的东西:

  Result:
    4  - row1
    2  - row2
    1  - row3

以任何形式

谢谢你。

4

2 回答 2

1

您的函数只返回一个值 ( return c1)。它正在返回循环中的最后一个值。

在 MySQL 中,函数不返回表。如果你想要四行,那么你需要执行一个查询。或者,您可以将所有值连接成一个字符串,然后返回。你想让这个功能做什么?

于 2013-04-22T15:44:07.583 回答
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语句来总结您要查找的计数。请注意,它?代表您要查询的结束时间值。

这将返回包含所有值的单行。

于 2013-04-22T15:54:51.580 回答