2013-04-22 91 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中,函數不返回表。如果你想要四行,那麼你需要執行一個查詢。或者,您可以將所有值連接在一起形成一個字符串,然後返回。你想要這個功能做什麼?