我目前正在使用此代码输出结果数组:
<?PHP
$db = JFactory::getDbo();
//Start date
$startdate = date('2010-05-21');
// End date
$end_date = date("Y-m-d");
$arraystring = '';
while (strtotime($startdate) <= strtotime($end_date)) {
$query = "SELECT * FROM table1 WHERE FROM_UNIXTIME(tm,'%Y-%m-%d') = '".$startdate."'";
$db->setQuery($query);
$replyAGS = $db->query();
$my_count = $db->getNumRows();
$arraystring .= $my_count.', ';
$startdate = date ("Y-m-d", strtotime("+1 day", strtotime($startdate)));
}
$arraystring = rtrim($arraystring, ', ');
?>
正如您所看到的,我在从特定日期到当前日期的循环中进行数据库查询。 假设这个循环是从jan运行的。 2007年1月。 2014年这将意味着2557的总循环,这不会是性能/服务器负载的严重问题?? 有更聪明的方法吗?
答案 0 :(得分:1)
请尝试使用此查询:
SELECT FROM_UNIXTIME(tm,'%Y-%m-%d') AS `Day`
, COUNT(*) AS Visits
FROM `table1`
GROUP BY
FROM_UNIXTIME(tm,'%Y-%m-%d')
如果适合你,你必须添加:
WHERE FROM_UNIXTIME(tm,'%Y-%m-%d') > DATE('2010-05-21')
答案 1 :(得分:1)
我终于做到了! 我认为这是一个合理的解决方案,而不会对服务器资源造成太大压力。
请看一下,看看性能是否合适。请注意,我在while循环中使用了foreach循环,但至少现在我没有在每个循环中查询MySQL ..
<?php
$query = "SELECT FROM_UNIXTIME(tm,'%Y-%m-%d') AS Day, COUNT(*) AS Visits FROM table1 GROUP BY FROM_UNIXTIME(tm,'%Y-%m-%d')";
$db->setQuery($query);
$replyAGS1 = $db->query();
$rowsarray = $db->loadObjectList();
$arrayforyearchart = '';
while (strtotime($startdateforarray) <= strtotime($end_date)) {
$counttouse = 0;
foreach ($rowsarray as $keycount) {
if ($keycount->Day == $startdateforarray) {
$counttouse = $keycount->Visits;
}
}
$arrayforyearchart .= $counttouse.', ';
$startdateforarray = date ("Y-m-d", strtotime("+1 day", strtotime($startdateforarray)));
}
$arrayforyearchart = rtrim($arrayforyearchart, ', ');
?>
修改
这是我制作的优化代码,我只做一个数据库查询和一个循环。 我使用智能检测内部循环来检查每天是否缺少结果,如果需要,我将数组填入零值。 看这里:
<?php
$query = "SELECT FROM_UNIXTIME(tm,'%Y-%m-%d') AS Day, COUNT(*) AS Visits FROM #__cwtraffic GROUP BY FROM_UNIXTIME(tm,'%Y-%m-%d')";
$db->setQuery($query);
$replyAGS1 = $db->query();
$rowsarray = $db->loadObjectList();
$arrayforyearchart = '';
$loopcount = 0;
//Loop START
foreach ($rowsarray as $keycount) {
$loopcount = $loopcount + 1;
if ($loopcount == 1) {
$startdateforarray = $keycount->Day;
//Data needed later for chart START
$startdateUnix = strtotime($keycount->Day);
$startdateDay = date('j', $startdateUnix);
$startdateMonth = date('n', $startdateUnix);
$startdateYear = date('Y', $startdateUnix);
//Data needed later for chart END
}
//Fill the array with zero counts if needed START
$currentdateinloop = strtotime($keycount->Day);
$comparedate = strtotime($startdateforarray);
$datediff = $currentdateinloop - $comparedate;
$istheregap = floor($datediff/(60*60*24));
$i=1;
while ($i <= $istheregap) {
$arrayforyearchart .= '0, ';
$i++;
}
//Fill the array with zero counts if needed END
$arrayforyearchart .= $keycount->Visits.', ';
$startdateforarray = date ("Y-m-d", strtotime("+1 day", strtotime($startdateforarray)));
}
//Loop END
$arrayforyearchart = rtrim($arrayforyearchart, ', ');
?>
答案 2 :(得分:0)
我猜测最终的实施,但我建议
首先获取所需的所有记录(您可以自定义查询以便为您提供较少的记录)。
$query = "SELECT * FROM table1";
循环$ result
时if(isset($count[strtotime($result['tm'])])){
$count[strtotime($result['tm'])] += 1;
}else{
$count[strtotime($result['tm'])] = 1;
}
通过这种方式,您可以获得按时间戳分组的数组中的计数。
然后你需要对它进行排序,使其按升序排列
ksort($count);
然后循环数组以获取日期
foreach($count as $date=>$val){
$_date_count[date('Y-M-d',$date)] = $val;
}
你也做
$arraystring = implode(',',$_date_count);
这是你想要的吗?
答案 3 :(得分:0)
您可以将查询更改为以下内容:
SELECT * FROM table1 WHERE FROM_UNIXTIME(tm) BETWEEN '" . $startdate . "' AND '" . $end_date . "'
。这将选择您提供的时间范围内的所有结果。
接下来,您需要遍历结果并计算每天的结果数量,如下所示:
$query = "SELECT * FROM table1 WHERE FROM_UNIXTIME(tm) BETWEEN '" . $startdate . "' AND '" . $end_date . "'";
$db->setQuery($query);
$counts = array();
while ($result = $db->loadAssoc()) {
$counts[$result['tm']] = (isset($counts[$result['tm']])) ? ($counts[$result['tm']] + 1) : 1;
}
然后最后在您现有的while循环中,您可以$my_count = (isset($counts[$result['tm']])) ? $counts[$result['tm']] : 0;
访问给定日期的结果数量。
这导致:
<?PHP
$db = JFactory::getDbo();
//Start date
$startdate = '2010-05-21';
// End date
$end_date = date("Y-m-d");
$query = "SELECT * FROM table1 WHERE FROM_UNIXTIME(tm) BETWEEN '" . $startdate . "' AND '" . $end_date . "'";
$db->setQuery($query);
$counts = array();
while ($result = $db->loadAssoc()) {
$counts[$result['tm']] = (isset($counts[$result['tm']])) ? ($counts[$result['tm']] + 1) : 1;
}
$arraystring = '';
while (strtotime($startdate) <= strtotime($end_date)) {
$my_count = (isset($counts[$result['tm']])) ? $counts[$result['tm']] : 0;
$arraystring .= $my_count.', ';
$startdate = date ("Y-m-d", strtotime("+1 day", strtotime($startdate)));
}
$arraystring = rtrim($arraystring, ', ');
?>
现在,您只有1个查询具有相同的功能。
接下来,我可能会将计数代码移动到它自己的函数中,如下所示:
<?php
function getDayCounts($startdate, $enddate) {
$query = "SELECT * FROM table1 WHERE FROM_UNIXTIME(tm) BETWEEN '" . $startdate . "' AND '" . $enddate . "'";
$db->setQuery($query);
$counts = array();
while ($result = $db->loadAssoc()) {
$counts[$result['tm']] = (isset($counts[$result['tm']])) ? ($counts[$result['tm']] + 1) : 1;
}
return $counts;
}
$db = JFactory::getDbo();
//Start date
$startdate = '2010-05-21';
// End date
$end_date = date("Y-m-d");
$counts = getDayCounts($startdate, $end_date);
$arraystring = '';
while (strtotime($startdate) <= strtotime($end_date)) {
$my_count = (isset($counts[$result['tm']])) ? $counts[$result['tm']] : 0;
$arraystring .= $my_count.', ';
$startdate = date ("Y-m-d", strtotime("+1 day", strtotime($startdate)));
}
$arraystring = rtrim($arraystring, ', ');
希望这有帮助。