2016-05-16 13 views
0

私は1つの手順で一時テーブルを作成する必要があります。
今私の手順は以下の通りであった。
1. DROP TEMPORARY TABLE私はしたくないMySQLの一時テーブルを簡単に選択する方法は?

を存在する場合
2.テーブル
4. DROP TEMPORARY TABLEで何かをするTEMPORARY TABLE
3. CREATE存在する場合プロシージャを呼び出すたびに一時テーブルを作成します。
私はちょうど一時テーブルを切り捨てたいですが、既存の一時テーブルにいくつかのデータをどのように選択するのですか?

ブロー手順をより速く実行するにはどうすればよいですか?

DROP PROCEDURE IF EXISTS `test`; 
DELIMITER ;; 
CREATE PROCEDURE `test`(IN type INT) 
begin 

DECLARE done INT DEFAULT 0; 
DECLARE total INT DEFAULT 0; 
DECLARE min_1 INT DEFAULT 0; 
DECLARE min_10 INT DEFAULT 0; 
DECLARE min_30 INT DEFAULT 0; 
DECLARE tmp INT DEFAULT 0; 
DECLARE cursor1 CURSOR FOR SELECT TIMESTAMPDIFF(MINUTE,time1,time2) as dif FROM t_test ; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

DROP TEMPORARY TABLE if EXISTS t_test; 
CREATE TEMPORARY TABLE t_test AS (
    SELECT optime as time1,dtime as time2 
    FROM tbmytest 
    WHERE thetpye = type); 

OPEN cursor1; 
REPEAT 
FETCH cursor1 INTO tmp; 
IF done = 1 THEN 
    close cursor1; 
ELSE 
    SET total = total + 1; 
    IF tmp > 30 THEN 
    SET min_30 = min_30 + 1; 
    ELSEIF tmp > 10 THEN 
    SET min_10 = min_10 + 1; 
    ELSEIF tmp > -1 THEN 
    SET min_1 = min_1 + 1; 
    END IF; 
END IF; 
UNTIL done END REPEAT; 

DROP TEMPORARY TABLE if EXISTS t_test; 
SELECT min_1,min_10,min_30,total; 
end;; 
DELIMITER ; 
+0

なく、あなたのセッション終了 –

+0

後、私はあなたが列を一時テーブルが使用され何が毎回 –

+0

同じことを期待することができるかどうかわからないのMySQLが、自己破壊、通常は一時テーブルについて確認してください。 – Raptor

答えて

0

カーソルは非常に遅いです。一時テーブルは必要ではないかもしれません。

1つのクエリで同じ手順を実行できます。これには変数を使用します。次の問合せでその作業を実行する必要があります。

SELECT @min30, @min10, @min1 FROM (
    SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2), 
    CASE WHEN @diff > 30 THEN @min30 := @min30 + 1 
     WHEN @diff > 10 THEN @min10 := @min10 + 1 
     WHEN @diff > -1 THEN @min1 := @min1 + 1 
    END 
    FROM t_test 
    CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery 
) another_subquery_alias 

あなたの質問が単純化されているかどうかわかりません。つまり、他の目的のために一時テーブルが必要です。そうであれば、テーブルを削除して作成する代わりに、MEMORYエンジンのテーブルを使用し、必要に応じてしばらくして更新することもできます。

CREATE TABLE my_special_temp_table 
(min30 int, min10 int, min1 int) 
ENGINE=MEMORY; 

UPDATE my_special_temp_table 
JOIN (
    SELECT @min30 AS min30, @min10 AS min10, @min1 AS min1 FROM (
     SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2), 
     CASE WHEN @diff > 30 THEN @min30 := @min30 + 1 
      WHEN @diff > 10 THEN @min10 := @min10 + 1 
      WHEN @diff > -1 THEN @min1 := @min1 + 1 
     END 
     FROM t_test 
     CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery 
    ) another_subquery_alias 
) t 
SET my_special_temp_table.min30 = t.min30, 
my_special_temp_table.min10 = t.min10, 
my_special_temp_table.min1 = t.min1; 
関連する問題