繁体   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