我正在创建一些报告,总结来自在线工作板的用户操作(点击)。
MYSQL 表的结构使得每天的活动有一个表。表名是标准的(日期除外),例如'User_Clicks_DD_MM_YYY'
我想从所有表(包括尚未创建的未来表)中进行选择,而不必每天重新访问代码。
有人知道我可以这样做的方法吗?
答案 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();