从尚不存在的表中选择

时间:2021-07-07 10:45:25

标签: mysql sql

我正在创建一些报告,总结来自在线工作板的用户操作(点击)。

MYSQL 表的结构使得每天的活动有一个表。表名是标准的(日期除外),例如'User_Clicks_DD_MM_YYY'

我想从所有表(包括尚未创建的未来表)中进行选择,而不必每天重新访问代码。

有人知道我可以这样做的方法吗?

1 个答案:

答案 0 :(得分:0)

这是解决这个问题的一种方法,它是一个构建查询的存储过程

它的作用是遍历一系列日期(您可以将 now() 替换为最后一个日期)并检查是否存在特定日期的表。如果它确实存在,那么它将它添加到一个选择语句字符串中。然后字符串在过程结束时执行。

create table tab_01_01_2020 (id int);
create table tab_02_01_2020 (id int);
insert into tab_01_01_2020 values (1);
insert into tab_02_01_2020 values (1);

DELIMITER $$
DROP PROCEDURE IF EXISTS test$$
CREATE PROCEDURE test()
BEGIN
    DECLARE count INT DEFAULT 0;
    DECLARE mydate DATE;

    set mydate = '2020/01/01';

    set @qry='select 0 as id where 1 = 0';

    WHILE mydate < '2020/02/01' DO
        SET count = count + 1;

        set @day = (SELECT RIGHT(CONCAT('0',DAY(mydate)), 2));
        set @mon = (SELECT RIGHT(CONCAT('0',MONTH(mydate)), 2));
        set @tab = CONCAT('tab_',@day,'_',@mon,'_',YEAR(mydate));
        
        IF (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = @tab) = 1
        THEN
            set @qry = CONCAT(@qry, ' union select id from ', @tab);
        END IF;

        SET mydate = DATE_ADD(mydate, INTERVAL 1 DAY);
    END WHILE;

    select @qry;

    prepare stmt from @qry;
    execute stmt;
    deallocate prepare stmt;
END$$
DELIMITER ;

call test();
相关问题