用于从相同表中搜索的 mysql 存储过程

标签 mysql sql stored-procedures innodb

开发人员您好,我正在研究从许多具有相同结构的表中快速选择行的方法。表中的数据太多,无法成为 1 个表。所以每个表都包含 1 个月的数据。 例如 log_2011_01 、log_2011_02 等。表具有日期时间列 created_at

我需要创建存储过程,它必须包含 2 个日期时间参数,用于在这个日期和其他几个日期之间进行搜索。

现在我看到下一个实现: 存储过程必须计算 2 个日期之间的表集合并生成 sql 以使用 union_all 选择数据。 我想我会很重,还没准备好承受高负荷,不是吗? 还有其他可能性吗? 谢谢

最佳答案

同意其他评论,但我试图在 SP 方面帮助您。此 SP 构建可以使用 prepared statements 执行的查询.

-- SP definition:

DELIMITER $$

CREATE PROCEDURE iterateMonths(IN fromDate DATE, IN toDate   DATE)
BEGIN
  DECLARE tempDate DATE;
  DECLARE query    VARCHAR(1000); -- Query string, length might be increased

  SET tempDate = fromDate - INTERVAL (dayofmonth(fromDate) - 1) DAY;

  WHILE tempDate <= toDate
  DO

    IF query IS NOT NULL THEN
      SET query = concat(query, '\r\nUNION ALL\r\n');
    ELSE
      SET query = '';
    END IF;

    SET query = concat(query, 'SELECT * FROM log_', DATE_FORMAT(tempDate, '%Y_%m'));
    SET tempDate = tempDate + INTERVAL 1 MONTH;
  END WHILE;

  SELECT query; -- Output generated query
END
$$

DELIMITER ;

-- Call the SP

SET @fromDate = '2010-07-29';
SET @toDate = '2011-08-29';
CALL iterateMonths(@fromDate, @toDate);

-- Output:

SELECT * FROM log_2010_07
UNION ALL
SELECT * FROM log_2010_08
UNION ALL
SELECT * FROM log_2010_09
UNION ALL
SELECT * FROM log_2010_10
UNION ALL
SELECT * FROM log_2010_11
UNION ALL
SELECT * FROM log_2010_12
UNION ALL
SELECT * FROM log_2011_01
UNION ALL
SELECT * FROM log_2011_02
UNION ALL
SELECT * FROM log_2011_03
UNION ALL
SELECT * FROM log_2011_04
UNION ALL
SELECT * FROM log_2011_05
UNION ALL
SELECT * FROM log_2011_06
UNION ALL
SELECT * FROM log_2011_07
UNION ALL
SELECT * FROM log_2011_08

关于用于从相同表中搜索的 mysql 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829225/

相关文章:

mysql - 更改 MySQL 中的列顺序

mysql - 使用准备好的语句从多列进行 SQL 查询

mysql - 如何计算mysql行中某些值的出现次数?

Mysql 在第三个表上使用 WHERE 连接三个表

mysql 存储过程在 'END' 上失败

mysql - 在单个 sql 语句中获取多个条件的计数和总和

sql - 如何从存储过程输出中进行选择

mysql - 如何修复 "ERROR 130 (HY000): Incorrect file format"

mysql - sql insert into, select, where 语句

mysql - 检索满足特定条件的行