0

我正在处理一些报告,我正在尝试创建一个查询,该查询将根据所选日期选择不同的查询,这是我试图实现的简化版本

SELECT *
FROM
    IF(YEAR('###date start###'=2011),table_2011,table)
WHERE
    date_start BETWEEN '###date start###' AND '###date end###'

###date start###是用户输入的###date end###参数。

我不能使用该语言根据日期选择不同的表,因为这只是一个示例,我可能传递了其他参数来选择不同的表。

我在想我需要创建一个新的 preg_replace 并强制创建查询的人添加类似的东西,###if(test,val2,val2)###但如果 mysql 已经可以做到这一点,我不想重新发明热水。

谢谢

编辑

在等待更好的解决方案时,我将“搜索替换”功能从一个简单的: ###search###=> value(其中 ###search### 显示给最终用户作为手动输入的字段),也接受一个新的字段格式为 LLLlabel[option:value,option:value,option:value,....]LLL

不是最好的解决方案,因为我希望我只能使用 MySQL 来做到这一点,因为这个解决方案只是让最终用户不得不选择一个额外的参数。

请记住,问题只是查询的一个非常简化的版本,查询可以是子查询、联合或连接的一部分,而不仅仅是time分隔

4

2 回答 2

1

具有以下内容的存储过程将起作用:

DELIMITER //

CREATE PROCEDURE example(date_start DATETIME, date_end DATETIME)
BEGIN
    SET @table = IF(YEAR(date_start)=2011,'table_2011','table');

    SET @sql = CONCAT(
        "SELECT * FROM ",
        @table,
        " WHERE date_start BETWEEN ",
        QUOTE(date_start),
        " AND ",
        QUOTE(date_end)
    ); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END;
//

DELIMITER ;

并通过以下方式调用它:

CALL example('###date start###', '###date end###');

或者如果您的数据在 MyISAM 表中,您可以设置一个MERGE表:

CREATE TABLE all_tables (...) ENGINE = MERGE UNION=(table_2011, table);

SELECT *
FROM
    all_tables
WHERE
    date_start BETWEEN '###date start###' AND '###date end###'
于 2012-11-12T14:54:28.587 回答
0

如果表不相交,这可能会起作用:

select *
from (select * from table_2011
      union
      select * from table) x
where date_start BETWEEN '###date start###' AND '###date end###';

更新

如果您关心大小,则应该考虑对表进行分区。看

于 2012-11-12T14:51:13.370 回答