在特定MySQL数据库中的整个表上运行查询

时间:2015-12-23 02:57:03

标签: php mysql

我有一个用于存储日志文件的MySQL数据库。

系统每隔30天创建一个名称以日期结尾的新表。例如,它可以是log_01-11-2015log_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依此类推。每个月的第一个系统都会创建一个新表并按月存储数据

1 个答案:

答案 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

您可以根据需要使用和调整功能,使用您使用的日期/时间格式。

如果您希望不仅从日志文件中获取所有数据,而且还希望在某个开始日期和结束日期之间的数据落入月内,您甚至可以为此函数添加值。