mysql循环查询只返回单个记录

时间:2013-04-22 15:36:02

标签: mysql

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

以任何形式

谢谢。

2 个答案:

答案 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语句来总结您要查找的计数。请注意,?表示您要查询的结束时间值。

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