easy select 如何在 MySQL 中转换为 temp table?

How can easy select into temp table in MySQL?

我需要在一个过程中创建一个临时文件 table。
现在我的步骤是:
1. 如果存在
,则删除临时 TABLE 2. 创建临时 TABLE
3. 用 table
做点什么 4. 如果存在

,则删除临时 TABLE

我不想在每次调用过程时都创建临时 table。
我只是想 t运行cate temp table,但是如何 select 一些数据到现有的 temp table??

如何使打击过程运行更快?

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 ;

光标非常非常慢。临时 table 可能不是必需的。

您可以在单个查询中实现与过程相同的效果。为此使用变量。以下查询应该可以完成这项工作。

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

我不知道你的问题是否被简化了,这意味着你也需要临时 table 用于其他目的。如果是这样,除了删除和创建 table,您还可以使用 table 和 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;