我有一个用于存储日志文件的MySQL数据库。
系统每隔30天创建一个名称以日期结尾的新表。例如,它可以是log_01-11-2015
,log_01-12-2015
等,并按月存储日志。
我的要求是在日期范围内搜索活动日志,例如从1月到12月。编写长SQL联合查询不适用于Web应用程序。我正在使用php
;是否有任何方法可以在databsse中进行查询而无需通过放置所有表名来编写长联合查询?
TABLE_NAME : log_01-11-2015
Table_content
log_id
log-date_time
user_ip
activity_id
TABLE_NAME : log_01-12-2015
Table_content
log_id
log-date_time
user_ip
activity_id
依此类推。每个月的第一个系统都会创建一个新表并按月存储数据
答案 0 :(得分:2)
如果您使用的是PHP,您可以使用PHP创建自己的UNION'ed查询,有点类似于:
test.php的
<?php
$startdate = new DateTime('2015-01-01');
$enddate = new DateTime('2015-05-31');
echo getLogSQL($startdate, $enddate);
function getLogSQL($startdate, $enddate) {
$select = 'select * from log_';
$sql = $select . $startdate->format('Y-m');
if ($startdate->format('Y-m') === $enddate->format('Y-m')) {
return $sql;
}
while ($startdate <= $enddate) {
$startdate = new DateTime($startdate->add(new DateInterval('P32D'))->format('Y-m-01'));
$sql .= "\nunion all {$select}" . $startdate->format('Y-m');
if ($startdate->format('Y-m') === $enddate->format('Y-m')) {
return $sql;
}
}
}
?>
结果:
$ /c/php/php.exe test.php
select * from log_2015-01
union all select * from log_2015-02
union all select * from log_2015-03
union all select * from log_2015-04
union all select * from log_2015-05
您可以根据需要使用和调整功能,使用您使用的日期/时间格式。
如果您希望不仅从日志文件中获取所有数据,而且还希望在某个开始日期和结束日期之间的数据落入月内,您甚至可以为此函数添加值。