我正在处理一些报告,我正在尝试创建一个查询,根据所选日期选择不同的查询,这是我想要实现的简化版本
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
分离
答案 0 :(得分: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###'
答案 1 :(得分:0)
如果表格不相交,这可能会起作用:
select *
from (select * from table_2011
union
select * from table) x
where date_start BETWEEN '###date start###' AND '###date end###';
<强>更新强>:
如果您关注大小,则应考虑对表进行分区。见
PARTITION BY RANGE (YEAR(separated))