0

基本上我有一个每天有一张表的数据库。我需要查询最近 30 天的数据,这意味着我需要跨 30 个表执行选择语句。

这是在 php 中,表的名称是这样的;

table_01_03_13
table_02_03_13
table_03_03_13
table_04_03_13

etc...

我的问题是查询这些表的最佳方法是什么,记住它们是日期,我是否会在过去 30 天循环以创建我的查询字符串?这会给我一个像这样的字符串:

SELECT * FROM table_01_03_13, table_02_03_13, table_03_03_13, table_04_03_13....

或者是否有一个 SQL 函数可以更快更容易地做到这一点?

每天有一张表的唯一原因是每天有 40,000 条记录添加到数据库中。

4

3 回答 3

7

为什么不是这样的结构:

create table yourtable (
   id int,
   date_of_event timestamp
   ...
);

然后你可以简单地拥有

SELECT * FROM yourtable
WHERE date_of_event = '2013-04-10'

甚至在特定的日子里:

SELECT * FROM yourtable
WHERE YEAR(date_of_event) < 2013
   AND DAY(date_of_event) = 13

// fetch all the events that occured on 'day 13' or any month in the previous years.
于 2013-04-10T20:24:41.907 回答
0
<?php
    $tables = '';
    $daysInMonth = 30; // untrue, just an example..
    for($i = 1; $i <= $daysInMonth; $i++)
    {
        if(strlen($i) < 2) $i = str_pad($i, 2, '0', STR_PAD_LEFT);
        if($i===$daysInMonth) $tables .= 'table_' . $i . '_03_13';
        else $tables .= 'table_' . $i . '_03_13, ';
    }
    $query = 'SELECT * FROM ' . $tables;
    echo $query;
?>

输出:

SELECT * FROM table_01_03_13, table_02_03_13, table_03_03_13, table_04_03_13, table_05_03_13, table_06_03_13, table_07_03_13, table_08_03_13, table_09_03_13, table_10_03_13, table_11_03_13, table_12_03_13, table_13_03_13, table_14_03_13, table_15_03_13, table_16_03_13, table_17_03_13, table_18_03_13, table_19_03_13, table_20_03_13, table_21_03_13, table_22_03_13, table_23_03_13, table_24_03_13, table_25_03_13, table_26_03_13, table_27_03_13, table_28_03_13, table_29_03_13, table_30_03_13
于 2013-04-10T20:36:45.623 回答
-1

将日期收集到像“table_d_m_y”这样的数组中,然后从“.implode($tables)”中选择*。


由 Kolink 编辑以向此散文添加一些代码:

这些方面的东西:

$tables = Array();
for( $i=0; $i<30; $i++) $tables[] = "table_".date("d_m_y",strtotime("-".$i." days"));
query("SELECT * FROM ".implode(",",$tables));
于 2013-04-10T20:22:20.630 回答