取两个数组并用mysql查询循环获取结果

时间:2014-07-02 15:17:48

标签: php mysql

<?php 
//db connection goes here
$arr=array('12:30:00','01:30:01','02:30:01','03:30:01','04:30:01','05:30:01','06:30:01','07:30:01');
$arr1=array('01:30:00','02:30:00','03:30:00','04:30:00','05:30:00','06:30:00','07:30:00','08:30:00');

$cnt=count($arr);
for($i=0;$i<$cnt;$i++){
$sql="SELECT count(*) FROM report WHERE DATE_FORMAT(dt,'%H:%m:%i') BETWEEN  $arr[$i] AND $arr1[$i]";
}
//fetching in while and echo

这是我正在尝试的脚本,它会从两个不同的表reportreport1生成用户的报告计数和应用程序数。 报告就像

Time                  count Logged In user    Count-Apps

12:30:00-01:30:00
01:30:01-02:30:00
02:30:01 -03:30:00
03:30:01-04:30:00
04:30:01-05:30:00
05:30:01-06:30:00
06:30:01-07:30:00
07:30:01-08:30:00
08:30:01-09:30:00

report表用于计算用户数

user    datetimeuser(datetime)
a       12:30:00
b       01:30:00
c       01:30:01
d       02:30:00
用于计算应用数量的

report1

user    datetimeuser(datetime)
a       12:30:00
b       01:30:00
c       01:30:01
d       02:30:00

之前我已经完成了一个可以完成工作的脚本,但它会减慢服务器速度,因为我的脚本会在1小时间隔内放入cron作业并获取结果

previous.php

$time_ranges = array(
    array('12:30:00','01:30:00'),
    array('01:30:01', '02:30:00'),
    array('02:30:01', '03:30:00'),
    array('03:30:01', '04:30:00'),
    array('04:30:01', '05:30:00'),
    array('05:30:01', '06:30:00'),
    array('06:30:01', '07:30:00'),
    array('07:30:01', '08:30:00'),
    array('08:30:01', '09:30:00'), 
);

$sql="SELECT sub0.TimeRange, sub0.number, COUNT(*) AS countapps
FROM
(
SELECT 
CASE
";

foreach ($time_ranges as $r) {
$sql .= "
    WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '$r[0]' and '$r[1]'
       THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '$r[0]'), '%Y-%m-%d %H:%i:%s') ";
}

$sql .= "
    ELSE NULL
END AS StartRange,
CASE ";

foreach ($time_ranges as $r) {
$sql .= "
    WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '$r[0]' and '$r[1]'
        THEN STR_TO_DATE(CONCAT(CURDATE(), ' ', '$r[1]'), '%Y-%m-%d %H:%i:%s') ";
}

$sql .= "
    ELSE NULL
END AS EndRange,
CASE ";

foreach ($time_ranges as $r) {
$sql .= "
    WHEN DATE_FORMAT(dt,'%H:%i:%s') BETWEEN '$r[0]' and '$r[1]'
        THEN '$r[0]-$r[1]' ";
}

$sql .= "
    ELSE NULL
END AS TimeRange,
COUNT(*) as number
FROM report
WHERE DATE_FORMAT(dt,'%Y:%m:%d')=DATE(CURDATE())
GROUP BY StartRange, EndRange, TimeRange
HAVING TimeRange IS NOT NULL
) sub0
LEFT OUTER JOIN report1 
ON  report1.dt  BETWEEN sub0.StartRange AND sub0.EndRange
GROUP BY sub0.TimeRange, sub0.number";

$query=mysql_query($sql);
echo'<html>
<head>
<title>Count User Info TimeWise</title>
</head>
<h1>Count User</h1>
<table border="3" cellspacing="2">

<tr>
<th>range</th>
<th>count</th>
<th>Apps Count</th>';

while($row = mysql_fetch_array($query))
{
echo  "<tr>";
echo "<td>" . $row['TimeRange'] . "</td>";
echo "<td>" . $row['number'] . "</td>";
echo "<td>" . $row['countapps'] . "</td>";
echo "</tr>";
}
echo "</table>";      
echo "</html>";
?>

我想通过只使用两个数组并循环它来使mysql查询更短更精确。但是无法真正使用它。请帮助我。我可以这样做两个数组然后计数(数组)和for循环它和mysql中的count语句

$arr=array('12:30:00','01:30:01','02:30:01','03:30:01','04:30:01','05:30:01','06:30:01','07:30:01');

$arr1=array('01:30:00','02:30:00','03:30:00','04:30:00','05:30:00','06:30:00','07:30:00','08:30:00');

$cnt=count($arr);
for($i=0;$i<$cnt;$i++){

$sql="SELECT count(*) AS test FROM report WHERE DATE_FORMAT(dt,'%H:%m:%i') BETWEEN   $arr[$i] AND $arr1[$i]";

1 个答案:

答案 0 :(得分:1)

可能动态地建立一个选择以返回时间,然后将其加入到您的报告表中: -

$numbers = array();
foreach($arr AS $key=>$value)
{
    $numbers[] = "SELECT '".$arr[$key]."' AS StartRange, '".$arr1[$key]."' AS EndRange ";
}

$dates_select = "(".implode(" UNION ",$numbers).") sub0";

$sql="SELECT sub0.StartRange, sub0.EndRange, count(report.dt) 
        FROM $dates_select 
        LEFT OUTER JOIN report 
        ON DATE_FORMAT(report.dt,'%H:%m:%i') BETWEEN  sub0.StartRange AND sub0.EndRange
        GROUP BY sub0.StartRange, sub0.EndRange";