需求:在传递一组职位编号的时候,需要统计该职位的 当天的投递情况 和 有历史记录以来总的投递量

解决方案一:

  每次都进行一次数据库查询,遍历职位id,再根据职位id去查询相应时间内的投递量

  1. /**
  2. * [exportData 导出相应职位的投递量]
  3. * @param [array] $params [需要查询的职位id,时间等]
  4. * @return [array] [相应职位id的投递量]
  5. */
  6. public function exportData($params){
  7. //进行数据库查询 [查询所要导出的数据]
  8. $getWhere = '1 =1';
  9. //开始时间和结束时间
  10. if( (isset($params['start_date']) && $params['start_date']) && (isset($params['end_date']) && $params['end_date']) ){
  11. $getWhere.=" and `addtime` between '{$params['start_date']}' and '{$params['end_date']}' ";
  12. }
  13. $jobidsArr = explode("," , $params['jobids']);
  14. $count = [];
  15. $dealCount = [];
  16. $actionTotal = [];
  17. $actionDealTotal = [];
  18. foreach ($jobidsArr as $key => $value) {
  19. $sql = "SELECT count(*) as count from hr_action where jobid = ".$value. " and ".$getWhere;
  20. $count[$key] = $this->db->findOne($sql);//返回数组
  21.  
  22. //获取当天的处理状态
  23. $sqlDeal = "SELECT count(*) as count from hr_action where jobid = ".$value. " and `astatus` > 0 and ".$getWhere;
  24. $dealCount[$key] = $this->db->findOne($sqlDeal);//返回数组
  25.  
  26. //总职位数和总处理情况进行查询
  27. $sqlTotal = "SELECT count(*) as count from hr_action where jobid = $value";
  28. $actionTotal[$key] = $this->db->findOne($sqlTotal);
  29.  
  30. $sqlDealTotal = "SELECT count(*) as count from hr_action where jobid = $value and `astatus` > 0";
  31.  
  32. $actionDealTotal[$key] = $this->db->findOne($sqlDealTotal);
  33.  
  34. }
  35.  
  36. foreach ($count as $ckey => $cvalue) {
  37. $actionCount[$ckey] = $cvalue['count'];
  38. }
  39. foreach ($dealCount as $dkey => $dvalue) {
  40. $actionDealCount[$dkey] = $dvalue['count'];
  41. }
  42. foreach ($actionTotal as $atkey => $atvalue) {
  43. $actionTotalCount[$atkey] = $atvalue['count'];
  44. }
  45. foreach ($actionDealTotal as $adtkey => $adtvalue) {
  46. $actionDealTotalCount[$adtkey] = $adtvalue['count'];
  47. }
  48.  
  49. return ['jobid'=> $jobidsArr , 'actionCount'=> $actionCount , 'actionDealCount' => $actionDealCount , 'actionTotalCount'=>$actionTotalCount,'actionDealTotalCount'=>$actionDealTotalCount];
  50. }

以上这种方法思路确实很简单,但是仔细查看,在运行的时候可以算一下进行了多少次的数据库查询,每一次的foreach循环都会进行四次查询数据库,当我一次传递30个职位的时候,就是4*30 次数据库查询了,由于数据库中的数量比较大,每次都全部便利一次这样的查询不满才怪呢。咳咳咳咳。。

方法二:尽量的减少数据库的查询,对数据库的操作越少越好。为什么不在第一次遍历投递情况的时候,把所有的投递情况都遍历出来保存到一个数组中,然后对数组进行操作,把对数据库的操作转换成php在内存中操作,这样不是挺好的吗?

因此,首次遍历的时候利用in 查询,把所有的投递情况都查询出来。

  1. /**
  2. * [exportData 导出相应职位的投递量]
  3. * @param [array] $params [需要查询的职位id,时间等]
  4. * @return [array] [相应职位id的投递量]
  5. */
  6. public function exportData($params){
  7. //进行数据库查询 [查询所要导出的数据]
  8. $getWhere = '1 =1';
  9. //开始时间和结束时间
  10. if( (isset($params['start_date']) && $params['start_date']) && (isset($params['end_date']) && $params['end_date']) ){
  11. $getWhere.=" and `addtime` between '{$params['start_date']}' and '{$params['end_date']}' ";
  12. }
  13. $jobids = $params['jobids'];//获取传入的职位id
  14. $jobidsArr = explode("," , $params['jobids']);
  15.  
  16. //根据职位id来查询相应的职位信息和公司信息
  17. $sqlInfo = "SELECT j.`title`,j.`id` from hr_job as j where id in ($jobids)";
  18. $jobTitle = $this->db->find($sqlInfo);
  19. $sqlCompany = "SELECT c.`comname`,j.`id` from hr_company as c right join hr_job as j on j.`user_id` = c.`user_id` where j.`id` in ($jobids)";
  20. $jobCompany = $this->db->find($sqlCompany);
  21.  
  22. //print_r($jobTitle);
  23. $newjobTemp = [];
  24. foreach ($jobTitle as $key => $value) {
  25. $newjobTemp[$value['id']] = $value['title'];
  26. }
  27.  
  28. $companyTemp = [];
  29. foreach ($jobCompany as $key => $value) {
  30. $companyTemp[$value['id']] = $value['comname'];
  31. }
  32. //print_r($newjobTemp);
  33. //
  34. //
  35.  
  36. /*************总职位数和总处理情况进行查询*************/
  37. $sqlTotal = "SELECT `jobid`,`addtime` ,`astatus` from hr_action where jobid in ($jobids)";
  38. $sqlDealTotal = "SELECT `jobid`,`addtime` ,`astatus` from hr_action where jobid in ($jobids) and ".$getWhere;
  39.  
  40. $retTotal = $this->db->find($sqlTotal);//返回总数
  41. $retDealTotal = $this->db->find($sqlDealTotal);//返回当天处理总数
  42.  
  43. /*************总职位数和总处理情况进行查询*************/
  44.  
  45. $temp1 = [];
  46. foreach ($retTotal as $ckey => $cvalue) {
  47. $temp1[$ckey] = $cvalue['jobid'];
  48. }
  49. $actionCount1 = array_count_values($temp1);
  50. //print_r($actionCount1);//投递总数
  51.  
  52. $temp2 = [];
  53. foreach ($retTotal as $dkey => $dvalue) {
  54. $temp2[$dkey] = [$dvalue['astatus'],$dvalue['jobid']];
  55. }
  56. //print_r($temp2);
  57.  
  58. $temp3 = [];
  59. foreach ($retDealTotal as $atkey => $atvalue) {
  60. $temp3[$atkey] = $atvalue['jobid'];
  61. }
  62. $actionCount3 = array_count_values($temp3);
  63. //print_r($actionCount3);
  64.  
  65. $temp4 = [];
  66. foreach ($retDealTotal as $adtkey => $adtvalue) {
  67. $temp4[$adtkey] = [$adtvalue['astatus'],$adtvalue['jobid']];
  68. }
  69. //print_r($temp4);
  70.  
  71. //按照预定义格式输出
  72. $actionCount = [];//总投递量
  73. $actionDayCount = [];//当天投递总量
  74. $adealCount = [];//定义一个新数组,存放相对应的总处理量
  75. $adaydealCount = [];//定义一个新数组,存放相对应的当天总处理量
  76. $actionDealCount = [];//存放转换后的总处理量
  77. $actionDayDealCount = [];//存放转换后的当天处理量
  78. $actionJobTitle = [];//职位名称
  79. $actionJobCompany = [];//公司名称
  80. foreach ($jobidsArr as $key => $value) {//循环传入的IDS
  81.  
  82. $i = ;
  83. foreach ($temp2 as $t2key => $t2value) {
  84. if ($value == $t2value[]) {
  85. if ($t2value[] > ) { $i++; }
  86. }
  87. $adealCount[$value] = $i;
  88. }
  89.  
  90. $j = ;
  91. foreach ($temp4 as $t4key => $t4value) {
  92. if ($value == $t4value[]) {
  93. if ($t4value[] > ) { $j++; }
  94. }
  95. $adaydealCount[$value] = $j;
  96. }
  97.  
  98. $actionCount[$key] = $actionCount1[$value];
  99. $actionDayCount[$key] = isset($actionCount3[$value])?$actionCount3[$value]:;
  100. $actionDealCount[$key] = $adealCount[$value];
  101. $actionDayDealCount[$key] = $adaydealCount[$value];
  102. $actionJobTitle[$key] = $newjobTemp[$value];
  103. $actionJobCompany[$key] = $companyTemp[$value];
  104. }
  105.  
  106. // print_r($actionJobTitle);
  107. /* print_r($actionCount);//总投递量
  108. print_r($actionDayCount);//当天投递总量
  109. print_r($actionDealCount);//总处理量
  110. print_r($actionDayDealCount);//当天处理量*/
  111.  
  112. return ['jobid'=> $jobidsArr , 'actionCount'=> $actionCount , 'actionDealCount' => $actionDealCount , 'actionDayCount'=>$actionDayCount,'actionDayDealCount'=>$actionDayDealCount,'actionJobTitle'=>$actionJobTitle , 'actionJobCompany'=>$actionJobCompany];
  113. }

导出数据,都是使用的同一套方法

  1. //导出相应职位的投递情况
  2. public function exportData($params = array()){
  3. /*[start_date] => 2016-11-23 12:09:05
  4. [end_date] => 2016-11-24 12:09:07
  5. [jobids] => 12,23,234,345,345,4564,5646*/
  6. /*echo "<pre>";
  7. print_r($params);*/
  8. $jobModel = new joblist_jobModel();
  9. $job_action_count = $jobModel->exportData($params);
  10.  
  11. ini_set('memory_limit','500M');
  12. set_time_limit();
  13.  
  14. $jobids = $job_action_count['jobid'];//查询的职位id
  15. $actionDayCount = $job_action_count['actionDayCount'];//当天的投递量
  16. $actionDayDealCount = $job_action_count['actionDayDealCount'];//当天处理量
  17. $actionCount = $job_action_count['actionCount'];//总投递量
  18. $actionDealCount = $job_action_count['actionDealCount'];//总处理量
  19. $actionJobTitle = $job_action_count['actionJobTitle'];//职位标题
  20. $actionJobCompany = $job_action_count['actionJobCompany'];//企业名称
  21. if(empty($jobids)){
  22. exit("暂无数据");
  23. }
  24.  
  25. $temp = [];
  26. foreach ($jobids as $key => $value) {
  27. $temp[$key] = [$value,$actionJobCompany[$key],$actionJobTitle[$key],$actionDayCount[$key], $actionDayDealCount[$key], $actionCount[$key], $actionDealCount[$key]];
  28. }
  29. /*print_r($temp);
  30. exit;*/
  31.  
  32. $column_name = array();
  33. header ( "Content-type:application/vnd.ms-excel" );
  34. header ( "Content-Disposition:filename=" . iconv ( "UTF-8", "GBK", date("Y-m-d_H_i_s" , time())."-".rand(,) ) . ".csv" );
  35. // 打开PHP文件句柄,php://output 表示直接输出到浏览器
  36. $fp = fopen('php://output', 'a');
  37. $head = ['职位编号','企业名称','职位名称','当天的投递量','当天的处理量','总投递量','总处理量'];
  38. foreach ($head as $i => $v) {
  39. $column_name[$i] = iconv('utf-8', 'GBK', $v);
  40. }
  41. fputcsv($fp, $column_name);
  42. foreach ($temp as $tkey => $tvalue ) {
  43. $rows = array();
  44. foreach ($tvalue as $newkey => $newvalue) {
  45. $rows[] = iconv('utf-8', 'GBK', $newvalue);
  46. }
  47. fputcsv($fp, $rows);
  48. }
  49. ob_flush();
  50. flush();
  51. die();
  52. }

关于MySQL性能的比较的更多相关文章

  1. [原] KVM 环境下MySQL性能对比

    KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...

  2. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  3. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  4. Mysql性能优化二

    接上一篇Mysql性能优化一 建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千 ...

  5. Mysql性能优化一

    下一篇:Mysql性能优化二 mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包 ...

  6. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  7. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  8. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  9. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

随机推荐

  1. 从外部导入jar包的三种方式

    我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3种Eclipse引入jar包的方式. 1.最常用的普通操作 ...

  2. jquery判断表单提交是否为空

    <input type="text" value="" name="toPage"> 判断该表单是否为空 var p = $(& ...

  3. grep;egrep;fgrep

    -1 使用场景:搜索定位内容并输出(所在行) -2 三者区别: --1 grep  默认支持普通正则 --2 egrep 默认支持扩展正则 等同于 grep -E --3 fgrep 速度最快,不支持 ...

  4. MFC与Qt的内存管理

    最近在做MFC向Qt的移植,在内存管理方面遇到了很头疼的问题,虽然不知道问题到底出在哪,先了解下这两个库的内存管理方式.于是转载两篇关于内存管理的文章. 一. Qt内存管理: 在Qt的程序中经常会看到 ...

  5. canvas.js | CLiPS

    canvas.js | CLiPS canvas.js The canvas.js module is a simple and robust JavaScript API for the HTML5 ...

  6. ERROR: HHH000388: Unsuccessful: create table

    做SSH整合的时候,总是出现错误信息: 类似这样: : HHH000388: Unsuccessful: create table right (right_code varchar(255) not ...

  7. 什么是FastCGI?

    什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...

  8. UGUI Scrollbar控件

    如题就是Scrollbar控件,它简单可以看成 Scrollbar 和 Image组件组成 它基本上不单独使用多数是制作滚动视图.我们来看看他独特的属性,重复的属性就不在介绍了! 属性讲解: Hand ...

  9. 实现一次请求加载多个js或者css

    http://tengine.taobao.org/   相当牛x

  10. DOS窗口中文显示乱码

    记得以前的dos是可以显示中文的,但是今天复制东西发现竟然不能显示中文了,遇见中文就成了? 在右键->默认值中的默认代码页也显示有中文GBK,但是不管用 在右键->属性中的当前代码页显示为 ...