[英]How can easy select into temp table in MySQL?
我需要在一個過程中創建一個臨時表。
現在我的步驟是:
1.如果存在則刪除臨時表
2.創建臨時表
3.在桌子上做些事
4.如果存在則刪除臨時表
我不想每次調用該過程時都創建臨時表。
我只想截斷臨時表,但是如何在現有的臨時表中選擇一些數據呢?
如何使打擊程序運行更快?
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 ;
游標非常非常慢。 臨時表可能不是必需的。
您可以在單個查詢中完成與該過程相同的過程。 為此使用變量。 以下查詢應能完成任務。
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
引擎的表來代替刪除和創建表,並在需要時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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.