簡體   English   中英

如何在MySQL中輕松選擇到臨時表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM