xiong's profile在河里抓鱼的熊PhotosBlogListsMore ![]() | Help |
在河里抓鱼的熊 |
||||
|
August 26 另一个更高效的sql以下是我在项目中的统计模块中使用的SQL操作,每一个统计仅使用了一条语句。其中有一个PHP变量($lastDay)其实也可以在SQL中生成,只是这样使语句变得更加复杂了,并且出于效率考虑,使用了PHP变量。
统计一: insert into ad_stat_ad_particular (s_ad_date, ad_id, s_ad_issuetime, s_ad_flash, s_ad_aflash, s_ad_rflash, s_ad_hit, s_ad_ahit, s_ad_must_income, s_ad_already_income) select {$lastDay['start']}, dz.ad_id, dz.s_ad_adz_issuetime, sum(dz.s_ad_adz_flash), sum(dz.s_ad_adz_aflash), sum(dz.s_ad_adz_rflash), sum(dz.s_ad_adz_hit), sum(dz.s_ad_adz_ahit), iti.isin_must_income, isin_must_income/isin_must_wastage*IF(sum(dz.s_ad_adz_rflash)>iti.isin_must_wastage, iti.isin_must_wastage, sum(dz.s_ad_adz_rflash)) from ad_stat_ad_adz_particular dz LEFT JOIN ad_issuetime_info iti ON (iti.ad_id=dz.ad_id AND dz.s_ad_adz_issuetime=iti.ad_issuetime) where s_ad_adz_date between {$lastDay['start']} and {$lastDay['end']} group by ad_id, dz.s_ad_adz_issuetime order by dz.ad_id, dz.s_ad_adz_issuetime; 解释如下: 使用"select...from ... left join on() where group by order by"查询出来的结果做为insert into 的内容。其中的select项中使用了sum(),四则运算和判断。语句拆解之后还是相对简单的。 统计二: SELECT @deduct:=spar_value FROM ad_sys_parameter WHERE spar_name='deduct'; SELECT @proportionment:=spar_value FROM ad_sys_parameter WHERE spar_name='proportionment'; INSERT INTO ad_stat_adz_particular (`s_adz_date`,`adz_id`,`s_adz_pv`,`s_adz_apv`, `s_adz_dpv`,`s_adz_hit`,`s_adz_ahit`,`s_adz_dhit`, `s_adz_payable`,`s_adz_deduct_amount`,`s_adz_proportionment`) SELECT {$lastDay['start']}, dz.adz_id, sum(dz.s_ad_adz_pv), sum(dz.s_ad_adz_apv), sum(dz.s_ad_adz_apv)*(100-@deduct)/100, sum(dz.s_ad_adz_hit), sum(dz.s_ad_adz_ahit), sum(dz.s_ad_adz_ahit)*@deduct/100, sum(dz.s_ad_adz_apv*iti.isin_must_income/iti.isin_must_wastage), sum(dz.s_ad_adz_apv*iti.isin_must_income/iti.isin_must_wastage)*(100-@deduct)*@proportionment/10000, sum(dz.s_ad_adz_apv*iti.isin_must_income/iti.isin_must_wastage)*@proportionment/100 FROM ad_stat_ad_adz_particular dz LEFT JOIN ad_issuetime_info iti ON (iti.ad_id=dz.ad_id AND dz.s_ad_adz_issuetime=iti.ad_issuetime) WHERE s_ad_adz_date between {$lastDay['start']} and {$lastDay['end']} GROUP BY adz_id; 这次有三句。第一、二句是获取两个值,以便下面使用。第三句与上面的构造方法一样,就不再做解释了。 以上的统计一与统计二执行一次十万条数据内容的表总共用时2-3秒。还是挺有效率的吧,如果还有可优化之处,请告之。 August 19 很久没有在这里写东西了很久没有在windows Live里面写东西了,主要因为livespace太慢,影响使用;其次,自己比较自闭,不愿意把自己的想法放到网上让大家看到。尤其是近两年美国片看多了,所以对自己的暴露于外的程度有所保留。
但自己的想法往往会自相矛盾:一方面希望能更多的了解别人;而另一方面却又希望别人不能随意的了解到我,朋友除外。所以计划多弄几个空间,一个做为交流情感、发布消息的地方,一个做为工作备忘,一个做为私人所有。可惜的是,现在我所用的几个空间都不太好用。blogspot常常被封,livespace太慢,ncp又太乱,我不太喜欢ncp中的地方,是Y!一向的粗旷的风格,虽然这是我参与开发的。自己曾想买个100M的PHP空间放个wordpress,但一直没有找到合适的,而且wp有很多不及ncp/blogspot的地方。看来我是太期望完美了,结果一事无成!
谈谈近况吧,也好给朋友们一个交待。
从7月离职后,在家休养了一段时间,眼睛不像以前那样疼了。没事的时候总会突发奇想,于是看了好几部连续剧:《追》《奋斗》《越犾》,个人看法留着另说。通过这段时间的调整,把自己的生物钟调成了GMT+10了,甚至更远;另外,年前买了相机,顺便学了点摄影知识,虽然家用自动相机不是学摄影的最佳选择,但也能学点,拍了点比较满意的照片,待会传上来。还有一位在东南亚出差的朋友不知道回来了没有,希望没被人妖收去做了徒弟! August 12 访问blogspot.com好久不能访问我在google博客了,原来以为是blogspot.com暂停了服务,可这么长时间了,还是没有恢复,一查,才知道是电信部门把blogsopt.com的DNS给屏蔽了,现在把访问方法做个备份。如果偶尔能帮得上别人的忙,那更好,算是我积德吧! 修改host文件: windows: %systemroot%\system32\drivers\etc\hosts *nix:/etc/hosts 添加一行:72.14.219.190 qian-xiong.blogspot.com June 30 高效的sql语句SELECT b.subject_name s_name, sum(a.click_no) c_no FROM sys_subject b, article_click_day a WHERE a.subject_id=b.subject_id AND b.chanel_id=1 GROUP BY a.subject_id; 这条语句执行一遍只需要2.9m,但用PHP多步操作实现相同的功能却需要20多秒。天壤之别! 下面的代码就是用PHP多部操作实现的原文,做个纪念: function getAllSubject($channel_id){ $sql = "SELECT subject_id FROM sys_subject WHERE chanel_id=$channel_id"; $data = gQuery($sql); return $data; } function getClickNum($subject_id){ global $channel_id; $sql = "SELECT sum(click_no) FROM article_click_day WHERE subject_id=$subject_id AND channel_id=$channel_id"; $data = gQuery($sql); /* //print_r($data); $rTemp = 0; echo count($data); for ($i=0; $i<=count($data)-1; $i++){ $rTemp += $data[$i]['click_no']; } * / //return $rTemp; //print_r($data); return 1; return $data[0]['sum(click_no)']; } function getSubjectName($subject_id){ $sql = "SELECT subject_name FROM sys_subject WHERE subject_id=$subject_id"; $data = gQuery($sql); //print_r($data); return $data[0]['subject_name']; } function visitsort(&$subjectAll, &$arr_subject, &$arr_click, &$visit_per){ global $channel_id; $arr_subject = array(); //栏目名称数组 $subjectAll = getAllsubject($channel_id); $click_no_all = 0; $visit_per = array(); //print_r($subjectAll); //echo count($subjectAll); for ($i=0; $i<count($subjectAll); $i++){ $arr_subject[] = getSubjectName($subjectAll[$i]['subject_id']); $arr_subject_id[] = $arr_subject[$i]; } $arr_click[] = getClickNum($subjectAll[$i]['subject_id']); $click_no_all += $arr_click[$i]; for ($i=0; $i<count($subjectAll); $i++){ $visit_per[$i] = round($arr_click[$i]/$click_no_all*100); } } June 21 Fedora Core 6 下安装ntfs支持NTFS文件系统读写支持 默认的内核没有加入对于NTFS文件系统的读写支持,但是Fedora Extras仓库中已经包含了支持官方发行的内核对应的NTFS支持包,可以选择安装。 # yum install fuse fuse-libs ntfs-3g ntfsprogs ntfsprogs-gnomevfs 来完成安装。使用NTFS分区,例如, # mount -t ntfs-3g -rw -o umask=0000 /dev/hda1 /media/c_driver 注意umask的设置。如果你使用的不是Fedora官方的内核,可能会有问题,请谨慎尝试。 使用NTFS的写功能是有风险的!!! |
|||
|
|