2013-04-22 85 views
4

我用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 ...

,所以我等希望像4 LOOP1,2环2以表格格式。

如果我错了或失去了一些东西只是指正....

我期待这样的:

Result: 
    4 - row1 
    2 - row2 
    1 - row3 

在任何形式

谢谢。

+2

您只有一个INT变量'c1',您可以在循环中覆盖并返回它。我不知道你为什么认为你应该得到一个结果集。如果你想在最近几个小时内获得记录,我不了解循环的必要性。 – 2013-04-22 15:42:18

+0

可能是我误解了它...有没有办法返回一张表作为结果.. – troy 2013-04-22 15:43:26

+0

你究竟在做什么? – 2013-04-22 15:43:58

回答

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语句来总结一下你正在寻找的计数。请注意,?代表您正在查询的结束时间值。

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

+0

它的工作真的很棒......但是当我想要计算最近12小时或最近24小时时,它变得有点冗长.....有没有什么方法可以解决它..因为有时候最后的小时数是动态决定的。 ... – troy 2013-04-22 16:01:44

+1

如果要检查最近48小时的数据.........? – DomincJune 2013-04-22 16:15:20

+0

如果是这样,我会采取完全不同的方法,实际上按小时对记录结果进行分组,然后在应用程序层进行任何必要的求和。我也将我的数据库字段更改为日期时间字段,以使这更容易。 – 2013-04-22 16:48:32

1

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

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