PHP以指定字段为索引返回数据库所取的数据数组

很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码。所以,在完成每个新项目的时 候,适当的做些项目总结、代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好、速度更快的实现方法等等。

牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性、逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员。我们不做日夜加班到深夜,拼代码量的程序员!
这篇和大家分享几个使用得PHP编程技巧,有些技巧是在看别人代码的时候学来的,有些是自己总结的。

以特定字段为索引,返回数据库取的数据数组
举个例子容易些:
假如你要统计指定站点从其它网站来的流量情况,并且做一个小后台,查看每个网站每天带来的流量情况。我们先建2张数据表:
表一、站点配置表(只统计这些网站的流量)


代码如下:

CREATE TABLE `site_config` (
`id` smallint(5) unsigned NOT NULL auto_increment COMMENT '主键,自增',
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`site_url` varchar(128) NOT NULL COMMENT '网站URL地址',
`site_name` varchar(80) NOT NULL COMMENT '网站名称',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`id`),
UNIQUE KEY `adid` (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='站点配置表';

表二、站点流量统计表(来一个用户一条记录)


代码如下:

CREATE TABLE `site_stat` (
`id` int(11) unsigned NOT NULL auto_increment COMMENT '主键,自增',
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`ip_address` varchar(32) NOT NULL COMMENT '用户IP',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='站点流量统计表' ;

因为site_config表读操作大于写操作,所以类型设置为MyISAM;而site_stat表写操作大于读操作,因此,我把表类型设置为InnoDB。(这些地方也是你在设计数据的时候需要考虑的,速度提高不少)。
回到正题,假如表site_config里有这样几条数据:
数据格式为:id,sid,site_url,add_time
1,200,baidu.com,2013-06-30 14:20:00
2,201,google.com,2013-06-30 14:20:00
3,202,cnblogs.com,2013-06-30 14:20:00
4,203,codejia.net,2013-06-30 14:20:00
站点流量统计表site_stat里已经产生了一些数据,如下:
数据格式为:id,sid,ip_address,add_time
1,200,167.87.32.4,2013-06-30 14:40:00
2,200,192.168.11.56,2013-06-30 14:40:10
3,202,167.87.32.4,2013-06-30 14:40:10
4,202,192.168.11.56,2013-06-30 14:40:20
5,203,167.87.32.4,2013-06-30 14:40:20
6,202,10.10.10.10,2013-06-30 14:40:30
7,200,167.87.32.4,2013-06-30 14:40:31
你在后台需要做的报表格式为:日期,网站ID,网站URL,流量数 (没有流量的站点也要展示,流量显示为0)
你可能会想到根据日期,在表site_stat里根据sid group by之后再left join表site_config,这显然不是我将分享的方法。
用2条SQL来搞定,一条是取所有的站点;另一条是取指定日期下站点流量统计数。

SQL1取所有站点:


代码如下:

SELECT sid,site_url,site_name FROM site_config

SQL2取站点统计(假如为今天):


代码如下:

SELECT sid,COUNT(1) AS come_total FROM site_stat
WHERE add_time>='2013-06-30 00:00:00'
AND add_time<='2013-06-30 23:59:59'
GROUP BY sid

前面说了一大堆都是为后面做铺垫,分享一个PHP以传过去的字段为索引,返回二维数组的方法:


代码如下:

protected function getList($sql,$filed = null){
$res = mysql_query($sql,$this->link_sc);
$data = array();
if($filed === null){
while($row = mysql_fetch_assoc($res)){
$data[] = $row;
}
}else{
while($row = mysql_fetch_assoc($res)){
$data[$row[$filed]] = $row;
}
}
return $data;
}

把你的SQL传进入,并把需要索引的字段传进入就OK,前提是传进去的字段必须要在select返回的字段里。
我们在取所有站点的时候不需要传过去字段,但在取站点流量统计的时候我们把,站点sid传过去,即如下:


代码如下:

$sites = getList($sql1); //所有站点
$data = getList($sql2,'sid'); //站点流量数据,以sid为索引返回二维数组

最后在展示报表的时候,用foreach循环$sites,取流量的时候到数组$data里去取索引为sid的数据就OK了。
非常方便,并且非常容易掌握,我就经常这么干。

最后看下上表的统计结果报表:
格式为:日期,网站ID,网站URL,流量数
2013-06-30,200,baidu.com,3
2013-06-30,201,google.com,0
2013-06-30,202,cnblogs.com,3
2013-06-30,203,codejia.net,1
总结:貌似写这么多就说明那样一个小的技巧哈,但是,可千万别小看这个技巧,能节约你很多时间。所以,大家在写代码的时候多多总结,多多来博客园和大家交流、学习,编程水平一定会进步很快的!

(0)

相关推荐

  • 浅谈数据库索引的作用及原理

    数据库索引是为了增加查询速度而对表字段附加的一种标识.很多人机械的理解索引的概念,认为增加索引只有好处没有坏处.其实远不是那样的,这里将其介绍尽量详细些. 首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合.如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度.那么在任何时候都应该加索引么?这里有几个反例:1.如果每次都需要取到所有表记录,无论

  • 什么是数据库索引 有哪些类型和特点

    有效优化VPS性能,提高VPS服务器运行速度,除了合理配置WEB服务器外,更多的是需要我们能够很好的优化网站程序及网站数据库,网站数据库的优化最为基础的优化措施就是建立数据库索引了,这里就介绍一下,什么是数据库索引?有哪些类型和特点? ⑴,什么是数据库索引? 数据库索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.在数据库中,索引的含义与日常意义上的"索引"一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象. ①

  • mysql数据库索引损坏及修复经验分享

    mysql表索引被破坏的问题及解决 下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为: Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired 提示说cms的文章表dede_archives被标记有问题,需要修复.于是赶快恢复历史数据,上网查找原因.最终将问题解决.解决方法如下: 找到mysql的安装目录的bin/myisamchk工具,在命令

  • Oracle数据库中建立索引的基本方法讲解

    怎样建立最佳索引? 1.明确地创建索引 create index index_name on table_name(field_name) tablespace tablespace_name pctfree 5 initrans 2 maxtrans 255 storage ( minextents 1 maxextents 16382 pctincrease 0 ); 2.创建基于函数的索引 常用与UPPER.LOWER.TO_CHAR(date)等函数分类上,例: create index

  • 基于B-树和B+树的使用:数据搜索和数据库索引的详细介绍

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点,则至少有两棵子树: ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树:⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,-,Kn,An)其中:Ki(i=1,2,-,n)为关键码,且Ki<Ki+1, Ai 为指向子树根结点的指针(i=0,1,-,n),且指针Ai-1 所指子

  • oracle数据库索引失效

    今天一个同事突然问我索引为什么失效.说实在的,失效的原因有多种: 但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息失效      需要重新搜集统计信息 3. 索引本身失效      需要重建索引 下面是一些不会使用到索引的原因 索引失效 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询

  • PHP以指定字段为索引返回数据库所取的数据数组

    很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码.所以,在完成每个新项目的时 候,适当的做些项目总结.代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好.速度更快的实现方法等等. 牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性.逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员.我们不做日夜加班到深夜,拼代码量的程序员! 这篇和大家分享几个使用得PHP编程技巧,有些技巧是在看

  • Mybatis-Plus条件构造器select方法返回指定字段方式

    目录 条件构造器select方法返回指定字段 条件构造器select用法 实例 问题解决 Mybatis-Plus修改指定字段 通用解决方案 条件构造器select方法返回指定字段 条件构造器select用法 1.返回特定的几个字段 select(字段…) 2.排除某几个字段 select(entiyClass,predicate判断) 3.分组聚合函数 select(“聚合函数”) 搭配service的.listMaps方法,将返回的数据封装到map中避免了多余字段的返回 实例 说明 :以下代

  • django自带serializers序列化返回指定字段的方法

    django orm 有个defer方法,指定模型排除的字段. 如下返回的Queryset, 排除'username', 'id'. users=models.UserInfo.objects.defer('username','id') 或users=models.UserInfo.objects.filter(...).defer('username','id') 再如下,使用django自带serializers进行序列,发现序列化的数据仍存在'username', 'id'这两个字段.

  • django filter过滤器实现显示某个类型指定字段不同值方式

    1,前端样式 2,html代码 {% load asset_filter %} <div class="col-sm-2"> <select class="input-sm form-control select2 inline" name="ServiceModel"> <option value="">模块</option> {% for i in 'Ecs'|ecs_mod

  • MySQL怎么给字符串字段加索引

    假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的: create table SUser(  ID bigint unsigned primary key,  email varchar(64),  ...  )engine=innodb; 由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句: select f1, f2 from SUser where email='xxx'; 如果 email 这个字段上没有索引,那么这个语句就只能做全表扫描. 1)那我可以在邮箱地址这个

  • SQL使用复合索引实现数据库查询的优化

    目录 一 问题 二 分析 三 解决方案 一 问题 程序再在一次查询时出现查询时间过长,每次查询要1-2分钟业务反馈用户操作体验很差,sql如下: select * FROM edi_booking edibooking0_ WHERE 1 = 1 AND edibooking0_.load_port_code IN ('CNCWN', 'CNDCB', 'AA', 'CNMWN' , 'CWHSD', 'CNSHK', 'CNYTN', 'CNSKU') AND edibooking0_.car

  • Yii使用find findAll查找出指定字段的实现方法

    本文以实例形式展示了Yii使用find findAll查找出指定字段的实现方法,分享给大家供大家参考之用.具体方法如下: 总所周知,采用如下方法: modelName::model() -> find() //找出的是一个对象 modelName::model() -> findALL() //找出的是一个对象集合的数组 可以找出对象与对象集合的数组,那么如何找出我所需要的字段的数据,而不是全部字段的数据呢?之前我是这么做的: $criteria = new CDbCriteria; $cri

  • 批量替换 MySQL 指定字段中的字符串

    批量替换的具体语法是: 复制代码 代码如下: UPDATE 表名 SET 指定字段 = replace(指定字段, '要替换的字符串', '想要的字符串') WHERE 条件; 如果你想把 article 表中 ID 小于5000的记录,content 字段中"解决"替换成"解放",那么语法就是: 复制代码 代码如下: UPDATE article SET content = replace(content, '解决', '解放') WHERE ID<5000

  • Python实现Sqlite将字段当做索引进行查询的方法

    本文实例讲述了Python实现Sqlite将字段当做索引进行查询的方法.分享给大家供大家参考,具体如下: 默认从sqlite中获取到的数据是数字索引的, 在开发阶段经常有修改数据库所以显得不太方便, 其实在python源码里就有解决方案, 直接读sqlite3的源码, 摸索了一些, 解决方案如下: 默认连接的话使用一下代码是以数字为索引的: conn = sqlite3.connect(dbfile) cur = conn.cursor() 为了使得获取到的结果集以字段为索引, 需要添加一个函数

  • Laravel Validator 实现两个或多个字段联合索引唯一

    Laravel的Validation还是蛮好用的,使用Validator可以非常方便的验证表单,它提供了unique唯一性验证,但是默认只能验证一个字段,那遇到两个甚至多个字段的联合索引,需要满足复杂条件唯一性怎么实现呢 Validator复杂唯一性实现方法 我们可以用自定义 Rule 自定义验证规则,比如像这样: [...] $where = [ 'name' => $request->name, 'phone' => $request->phone ]; $this->v

随机推荐