Php 如何根据日期范围和表名从多个表中选择数据(每季度)

Php 如何根据日期范围和表名从多个表中选择数据(每季度),php,Php,我有按季度划分在不同表格中的数据。例如,2017年第一季度,表名为kreports_first2017(数据来源于1月、2月和3月)。 因此,我有2017年第二届克里波特大学,以此类推,直到2017年第四届克里波特大学。接下来的几年也是如此 我的问题是如何从日期范围中按用户单击选择数据。我只从“起始日期”和“截止日期”中选择了表。例如,用户选择从2017-04-01到2018-03-01的数据。我设法将2017年第二季度和2018年第一季度的数据合并在一起。他们之间的桌子怎么样。2017年第三季

我有按季度划分在不同表格中的数据。例如,2017年第一季度,表名为kreports_first2017(数据来源于1月、2月和3月)。 因此,我有2017年第二届克里波特大学,以此类推,直到2017年第四届克里波特大学。接下来的几年也是如此

我的问题是如何从日期范围中按用户单击选择数据。我只从“起始日期”和“截止日期”中选择了表。例如,用户选择从2017-04-01到2018-03-01的数据。我设法将2017年第二季度和2018年第一季度的数据合并在一起。他们之间的桌子怎么样。2017年第三季度和2017年第四季度?以下是我的代码:

$quar = array
  (
  array("first","01","02","03"),
  array("second","04","05","06"),
  array("third","07","08","09"),
  array("fourth","10","11","12")
  );

$month = substr($date1,5,2);
$year = substr($date1,0,4);
$month2 = substr($date2,5,2);
$year2 = substr($date2,0,4);

for ($row = 0; $row < 4; $row++) {
if(in_array($month,$quar[$row]))
{
  $table1 = "kreports_" . $quar[$row][0] . $year . "";  
}
if(in_array($month2,$quar[$row]))
{
  $table2 = "kreports_" . $quar[$row][0] . $year2 . "";
}
}

$quarter = "(select * from $table1 UNION select * from $table2) AS quarter";

$sql = "SELECT DATE(r_time) AS date,SUM(login_total) AS total, SUM(login_unique) AS uniq FROM $quarter WHERE DATE(r_time) BETWEEN '$date1' AND '$date2' GROUP BY DATE(r_time) ORDER BY date ASC";
$data = $db->fetch_array($sql);
$quar=array
(
数组(“第一”、“01”、“02”、“03”),
数组(“第二”、“04”、“05”、“06”),
数组(“第三”、“07”、“08”、“09”),
数组(“第四”、“10”、“11”、“12”)
);
$month=substr($date1,5,2);
$year=substr($date1,0,4);
$month2=substr($date2,5,2);
$year2=substr($date2,0,4);
对于($row=0;$row<4;$row++){
if(在数组中($month,$quar[$row]))
{
$table1=“kreports”.$quar[$row][0]。$year.”;
}
if(在数组中($month2,$quar[$row]))
{
$table2=“kreports”.$quar[$row][0]。$year2.”;
}
}
$quarter=“(从$table1中选择*从$table2中选择*作为季度”;
$sql=“选择日期(r_时间)作为日期,总和(登录总数)作为总数,总和(登录唯一)作为uniq从$quarter开始,其中日期(r_时间)介于“$date1”和“$date2”之间的按日期分组(r_时间)按日期排序ASC”;
$data=$db->fetch\u数组($sql);

您不需要循环查找季度。只要把这个月除以3就可以得到季度。但是,首先,把它转换成int,然后用1减去它

$quarter1 = floor(((int)$month - 1) / 3);
$quarter2 = floor(((int)$month2 - 1) / 3);
之后,您可以使用这些结果以及年份来获得表格

$quarter = "(";
while ($quarter1 <= $quarter2 || $year < $year2) {
    $quarter .= "select * from kreports_" . $quar[$quarter1][0] . $year . " UNION ";
    $quarter1 = ($quarter1 + 1) % 4;
    $year += ($quarter1 == 0) ? 1 : 0; // move to next year once the quarter is set to first.
}
$quarter = substr($quarter, 0, -7); // remove the last " UNION "
$quarter .= ") AS quarter";
$quarter=“(”;

而($quarte1您不需要循环查找季度。只需将月份除以3即可得到季度。但是,首先,将其转换为
int
,然后减去1

$quarter1 = floor(((int)$month - 1) / 3);
$quarter2 = floor(((int)$month2 - 1) / 3);
之后,您可以使用这些结果以及年份来获得表格

$quarter = "(";
while ($quarter1 <= $quarter2 || $year < $year2) {
    $quarter .= "select * from kreports_" . $quar[$quarter1][0] . $year . " UNION ";
    $quarter1 = ($quarter1 + 1) % 4;
    $year += ($quarter1 == 0) ? 1 : 0; // move to next year once the quarter is set to first.
}
$quarter = substr($quarter, 0, -7); // remove the last " UNION "
$quarter .= ") AS quarter";
$quarter=“(”;

虽然($quarter1)与简单地查询
视图
以合并所有这些表相比,执行union select的性能有很大不同吗?我真的不确定。你的意思是说我应该创建视图并合并所有表吗?我的数据大约有几十万或几百万。我只是在选择中间的表时感到困惑。_。与简单地查询联合所有表的
视图相比,联合选择的性能有很大不同吗?我真的不确定。你的意思是说我应该创建视图并合并所有表吗?我的数据大约有几十万或几百万。我只是在选择中间的表时感到困惑。