Php 对特定MySQL数据库中的整个表运行查询

Php 对特定MySQL数据库中的整个表运行查询,php,mysql,Php,Mysql,我有一个用于存储日志文件的MySQL数据库 系统每隔30天创建一个新表,表名以日期结尾。例如,它可以是log\u 01-11-2015,log\u 01-12-2015,等等,并按月存储日志 我的要求是在日期范围内搜索他们的活动日志,比如从一月到十二月。编写长SQL联合查询不适用于web应用程序。我正在使用php;有没有办法在数据库中进行查询,而不通过放置所有表名来编写长联合查询? 表格名称:日志01-11-2015 表格内容 log\u id log-date\u-time user\u ip

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

系统每隔30天创建一个新表,表名以日期结尾。例如,它可以是
log\u 01-11-2015
log\u 01-12-2015
,等等,并按月存储日志

我的要求是在日期范围内搜索他们的活动日志,比如从一月到十二月。编写长SQL联合查询不适用于web应用程序。我正在使用
php
;有没有办法在数据库中进行查询,而不通过放置所有表名来编写长联合查询?
表格名称:日志01-11-2015
表格内容
log\u id
log-date\u-time
user\u ip
activity\u id

表格名称:日志01-12-2015
表格内容
log\u id
log-date\u-time
user\u ip

活动\u id
等等。每个月的第一天系统都会创建一个新表并按月存储数据

如果您使用的是PHP,您可能会使用PHP创建自己的联合查询,类似于以下内容:

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;
        }
    }
}
?>
您可以使用日期/时间格式,根据需要使用和调整该函数


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

我认为您可能需要使用存储过程来实现这一点。我认为您应该查看数据库结构:创建这么多表没有意义。您应该考虑使用合并表或表分区来从同一数据集拥有多个文件中获益,但将它们作为单个表查询。merge table的优点是,每个月都可以通过简单的alter table命令将新创建的日志表添加到合并的集合中。之后,对合并的表运行查询。@Aerendir post-edited,请参考数据库结构我这样做了
SELECT*FROM log\u 01-12-2015,log\u 01-12-2015
获取错误代码:字段列表中的1052
列“log\u id”不明确
谢谢您的解决方案,明白了。如果表名以数字序列结尾,而不是以
log\u 2015-01
结尾,如
log\u 100
log\u 101
log\u 103
,该怎么办如果表名没有日期指示,则在正确的表上进行查询将非常棘手。一个选项是将每个日志的开始和结束时间存储在元数据表中。读取该元数据表,然后查找要查询的正确表。正如Aerendir和Shadow所建议的,使用MySQL分区将日志放在一个表中可能会有所帮助。将超过某个日期的日志归档到归档表中。
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