通过不同的条件组装 一个sql语句

通过不同的条件组装 一个sql语句
题目要求:目前需要通过不同会员信息的条件,对会员进行高级查询,这个时候就需要对sql语句的组装工作。需要查询的条件有,会员编号,会员昵称,会员帐号,会员注册时间,会员性别,条件通过GET方式传递给程序,通过任意选择这些条件进行查询,得到相应的结果。
参考:
会员表为user_bas 及其字段结构;
查询条件和数据库字段对应关系:
会员编号:id ;结构:smallint(6),查询为精确查询(比如:查询编号为1 2的会员)
会员昵称:nickname;结构:varchar(20) (比如:查询昵称里有”魅力”的昵称)
会员帐号:uname;结构:varchar(16) 查询为模糊查询
会员注册时间:regtime;结构:int(10) 查询为时间段查询
会员性别:sex;结构:tingint(1) 查询为 查询为精确查询
目标:
写一段程序,实现这样的查询功能,”查询条件”需要的时候会增加和减少,考生需要编写一套灵活的程序
注意:
1。灵活性,
用户可以选择1个条件,也可以一个都不选择,也可以选择多个。”
2。考虑到系统的性能
有的面试者用:
“select * from user_bas where id=’$id’ and nickname=’$nickname’ and sex=’$sex’…”
是不可以的,如果没有$id的条件数据库也还要去便历,在超过10万的数据库就非常慢了。
3。不用考虑接受数据问题,和传递给数据库如何解释的问题。
如果你怎么接受不知道如何书写,你可以更简单的思考,现在有几个变量。$id,$nickname,$uname,$sex,$regtime 可以用这些变量,但有的为空;对于数据库如何去查询,还有就是,数据库如何解释不用关心,如query相关函数语句你不用写。
4.不允许使用”where 1″或”where 1=1″类型的语法

代码
_________________________________________________________________________

<?php
if($_SERVER[‘REQUEST_METHOD‘]==’GET’){
$id=$_GET[‘id‘];
$nickname=$_GET[‘nickname‘];
$uname=$_GET[‘uname‘];
$regtime=$_GET[‘regtime‘];
$sex=$_GET[‘sex‘];
}
$ConditionsNumber=5;
$ConditionsArray=array(“$id “,”$nickname”,”$uname”,”$regtime”,”$sex”);
$SearchSQLArray=array(” where id =’$id’”,” where nickname = ‘$nickname’”,” where uname=’$uname’”,” where regtime=’$regtime’”,” where sex=’$sex’”);
for($i=0;$i<$ConditionsNumber;$i++)
{
if($ConditionsArray[$i]==”")
$SearchSQLArray[$i]=”";
$haveWhere=false;
for($j=0;$j<$i;$j++)
{
$wherePosition=strpos($SearchSQLArray[$j],”where”);
if(($wherePosition==”1″)&&($haveWhere==false))
{
$SearchSQLArray[$i]=ereg_replace(“where”,”and”,$SearchSQLArray[$i]);
$haveWhere=true;
} } }}
for($i=0;$i<$ConditionsNumber;$i++)
$sql=$sql.$SearchSQLArray[$i];
$query=”SELECT * FROM user_bas “.$sql.” order by id;”;
?>

3.目前有会员登陆的log记录数组,登陆日志里面有这个会员的编号(id)、会员帐号(uname)和登陆时间(logtime)。
通过这个数组需要得到如下统计:
(1)得到某一天中不同会员的登陆情况,一天内会员登陆了4次,就记4次。统计结果如:
在2006-07-20内的会员登陆情况
会员编号 会员帐号 会员登陆次数
1 User1 4次
3 User3 2次
2 User2 1次
(2)得到某几天内不同会员的登陆情况,会员在某一天登陆了很多次只记一次(也可以说会员在几天内有几天登陆了)。统计结果如:
在2006-07-20 到2006-07-22 的3天时间内的会员登陆情况:
会员编号 会员帐号 会员登陆次数
3 User3 3次
1 User1 2次
2 User2 2次
附件:
会员登陆日志数组:
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 19:18:02′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 18:15:03′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 13:50:12′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-22 13:12:09′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-22 11:10:08′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 10:52:54′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-22 08:16:04′);

$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 19:18:02′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 18:15:03′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 13:50:12′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-21 13:12:09′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-21 11:10:08′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 10:52:54′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 08:16:04′);

$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 19:18:02′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-20 18:15:03′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 13:50:12′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-20 13:12:09′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-20 11:10:08′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 10:52:54′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 08:16:04′);

代码:
______________________________________________________________________________
<?php
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 19:18:02′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 18:15:03′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 13:50:12′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-22 13:12:09′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-22 11:10:08′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-22 10:52:54′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-22 08:16:04′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 19:18:02′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 18:15:03′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 13:50:12′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-21 13:12:09′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-21 11:10:08′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 10:52:54′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-21 08:16:04′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 19:18:02′);
$userlog[] = array (“id” => 2, “uname” => ‘user2′, “logtime” => ’2006-07-20 18:15:03′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 13:50:12′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-20 13:12:09′);
$userlog[] = array (“id” => 3, “uname” => ‘user3′, “logtime” => ’2006-07-20 11:10:08′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 10:52:54′);
$userlog[] = array (“id” => 1, “uname” => ‘user1′, “logtime” => ’2006-07-20 08:16:04′);
//第一题
$user=”;
$date=’2006-07-20′;
foreach($userlog as $val)
{
if(!isset($user[$val[‘id‘]]))
{
$user[$val[‘id‘]][‘id‘]=$val[‘id‘];
$user[$val[‘id‘]][‘uname‘]=$val[‘uname‘];
$user[$val[‘id‘]][‘logcounts‘]=0;
}
if(strstr($val[‘logtime‘],$date))
{
$user[$val[‘id‘]][‘logcounts‘]+=1;
}
}
echo ‘’;
print_r($user);
echo ‘’;
//第二题
$users=”;
$start=strtotime(’2006-07-20′);
$end =strtotime(’2006-07-22′)+3600*24;
$time=”;
foreach($userlog as $val)
{
if(!isset($users[$val[‘id‘]]))
{
$users[$val[‘id‘]][‘id‘]=$val[‘id‘];
$users[$val[‘id‘]][‘uname‘]=$val[‘uname‘];
$users[$val[‘id‘]][‘days‘]=array();
$users[$val[‘id‘]][‘logs‘]=0;
}
$time=strtotime($val[‘logtime‘]);
if($time>=$start & $time<$end)
{
if(!in_array(substr($val[‘logtime‘],0,10),$users[$val[‘id‘]][‘days‘]))
{
$users[$val[‘id‘]][‘days‘][]=substr($val[‘logtime‘],0,10);
$users[$val[‘id‘]][‘logs‘]+=1;
}
}
}
echo ‘’;
print_r($users);
echo ‘’;
?>

来源http://www.jobui.com/mianshiti/it/php/4225/

时间: 2024-11-10 01:27:17

通过不同的条件组装 一个sql语句的相关文章

SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为复用执行计划的性能比生成执行计划的性能要高很多,所以SqlServer的这一特性可以大大提高Sql语句的执行效率.特别是对于存储过程,因为存储过程的执行计划是在存储过程第一次执行的时候生成的,存储过程的执行计划生成后就会被缓存到SqlServer的执行计划列表中,如果以后存储过程再被执行,那么存储过

SQL SERVER 一个SQL语句的执行顺序

原文:SQL SERVER 一个SQL语句的执行顺序 一个SQL 语句的执行顺序 1.From (告诉程序 来自哪张表  如果是表表达式 依旧是如此顺序) 2.Where(条件筛选  谓词筛选 ) 3.Group by(分组) 4.Having(分组  谓词筛选 ) 5.Select (表达式) 6.表达式(开窗函数 聚合函数 等等) 7.Distinct(去重复) 8.ORDER BY 9.TOP/OFFSET-FETCH 原文地址:https://www.cnblogs.com/lonely

在MySQL数据库里用一个SQL语句取得本条记录及其上一条和下一条记录

在做文章页面时,有时候需要在文章下面显示出上一条和下一条记录.如果简单地使用id值加1和减1的方法来做会有缺陷. 各位看官请试想,如果我们删除了中间的某一条和某几条记录呢?那不是取不出来了? 所以,思想是很重要的,嗯.举个例子吧,比如说我有一个名叫XXX的表,里面有唯一的id字段.然后,里面有N条数据呢~~~ 现 在,我们来看看我们的思维.我们是要根据已知ID来找上一条和下一条的,也就是在数据库里相邻的三条记录, 中间那一条是确定的.那既然ID有可能不连续, 那我们就用>和<运算符来吧(要是L

JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("truncate QB_ShowCount_Asite_copy"); ps.executeBatch(); String SrcSql = "select convert(unhex(hex(convert(Community using latin1))) using utf8) as Commu

MySQL中一个sql语句包含in优化问题

第一版sql: SELECT module.id, module.module_name, module.module_code `module` where 92 IN (module.did_access) WHERE module.type =2 AND module.status =0 ORDER BY module.create_time ASC LIMIT 0 , 30 这样的sql语句会有缺陷,in的用法虽然看上去没问题,但是是不对的,这样查出的数据不全,所以优化了一下: 第二版s

一个SQL语句的优化(sqlserver)

最早的写法: WITH T AS (SELECT case when Col1 IS NULL OR Col1=N'' then Col2 else Col1 end as Code,case when Col1 IS NULL OR Col1=N'' then 1 else 0 end as Flag FROM YM WHERE Col_076 BETWEEN '2018-07-25' AND '2018-08-03' AND Col_478=N'xx' AND Col_346 LIKE N'

sql语句not in判断条件注意事项

问题描述:mysql数据库,存在两个表org表和kdorg表,用于存储组织信息.现在我需要从org表找出组织,条件为该组织不在kdorg表里. sql语句:select o.orgno o.orgname from org o where orgno not in(select kd.orgno from kdorg kd); 明明org表里存在一些组织,该组织的组织编号不存在于kdorg表,但查询结果就是0条记录.搞了一天,也没搞出问题在哪,头都大了,就是一条简单的sql语句,条件满足,为何就

SQL语句的执行顺序和效率

今天上午在开发的过程中,突然遇到一个问题,需要了解SQL语句的执行顺序才能继续,上网上查了一下相关的资料,现整理如下:一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句. 4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式. 5)选择优化器,不同的优化器一般产生不同的"执行计划" 6

实用SQL语句

一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4.说明:创建