PHP脚本错误,帮我减少28个mysql_queries

时间:2013-04-10 14:45:03

标签: php mysql

我最终得到了PHP中最糟糕的编写代码(它有效,但它太可怕了!也许你可以告诉我一个更好的方法)。我想在我的网页上显示14天的统计信息。我需要每天显示4个值(文件计数已下载,上传;文件大小已下载和上传)。我所拥有的是2个表(files和downloads_log),结构是:

文件(file_name,file_size,upload_datetime) downloads_log(file_name,dl_datetime)

所以我需要以下内容:

Count all files uploaded from table `files` in specific day
Count all files downloaded from table `downloads_log` in specific day
SUM file_size in table `files` in specific day
SUM file_size in table `files` where files.file_name = downloads_log.file_name in specific day

这是我过去14天所需要的一切。

"脚本"我已经完成了:

  for($i = 13; $i >= 0; $i--) {
    $query_downloads  = mysqli_query($con, "SELECT files.file_name, files.file_size, downloads_log.dl_file_name, downloads_log.dl_datetime, COUNT(file_name), SUM(file_size) FROM files, downloads_log WHERE files.file_name = downloads_log.dl_file_name AND `dl_datetime` >= '".date("Y-m-d", strtotime("-$i day"))." 00:00:00' AND `dl_datetime` <= '".date("Y-m-d", strtotime("-$i day"))." 23:59:59'");
    $result_downloads = mysqli_fetch_assoc($query_downloads);

    $query_uploads  = mysqli_query($con, "SELECT file_name, file_size, COUNT(file_name), SUM(file_size) FROM files WHERE `upload_datetime` >= '".date("Y-m-d", strtotime("-$i day"))." 00:00:00' AND `upload_datetime` <= '".date("Y-m-d", strtotime("-$i day"))." 23:59:59'");
    $result_uploads = mysqli_fetch_assoc($query_uploads);
  }

建议我,如何以更简单的方式实现这个问题,不要给mysql带来巨大的负担,谢谢:)

2 个答案:

答案 0 :(得分:2)

$i = 13;

$query = mysqli_query($con, "SELECT files.file_name, files.file_size, downloads_log.dl_file_name, downloads_log.dl_datetime, DATE(dl_datetime) AS datum, COUNT(file_name), SUM(file_size) FROM files, downloads_log WHERE files.file_name = downloads_log.dl_file_name AND `dl_datetime` >= '".date("Y-m-d", strtotime("-$i day"))." 00:00:00' AND `dl_datetime` <= '".date("Y-m-d", strtotime("-$i day"))." 23:59:59' GROUP BY DATE_FORMAT(dl_datetime, '%Y%m%d')");
while ($result = mysqli_fetch_assoc($query))
    $result_downloads[$result['datum']] = $result;

$query = mysqli_query($con, "SELECT file_name, file_size, COUNT(file_name), SUM(file_size), DATE(upload_datetime) AS datum FROM files WHERE `upload_datetime` >= '".date("Y-m-d", strtotime("-$i day"))." 00:00:00' AND `upload_datetime` <= '".date("Y-m-d", strtotime("-$i day"))." 23:59:59' GROUP BY DATE_FORMAT(upload_datetime, '%Y%m%d')");
while ($result = mysqli_fetch_assoc($query))
    $result_uploads[$result['datum']] = $result;

这会按不同日期对查询进行分组:GROUP BY DATE_FORMAT(upload/dl_datetime, '%Y%m%d')创建一个唯一的日期时间戳(%Y = 4位数年份,%m = 2位数月份,%d = 2位数日)

结果填入数组$ result_uploads / downloads,以日为索引。

答案 1 :(得分:2)

希望这会有所帮助:

SELECT files.file_name, files.file_size, downloads_log.dl_file_name, downloads_log.dl_datetime, COUNT(file_name), SUM(file_size) 
FROM files
join downloads_log on files.file_name = downloads_log.dl_file_name and to_days(now())-14<to_days(dl_datetime)
group by to_days(dl_datetime) 

在其他查询中使用相同的想法。你没事。

它每天选择最近14天和每组。