注册 登录
编程论坛 ASP技术论坛

多条件查询的实现方法...

zhongx 发布于 2007-08-30 19:25, 1799 次点击
多条件查询的实现方法...怎去写???????
33 回复
#2
madpbpl2007-08-30 19:37
最好详细说明一下你的条件,不太理解。
#3
zhongx2007-08-30 20:12
大概是:我要查询编号为:22,日期是:2007-8,录入员为:胡锦涛,的所有符合这个条件的数据全部列出.
字段是: 编号 日期 录入员
#4
madpbpl2007-08-30 20:28
select * from [tablename] where 编号="& request("id") &" and 日期='" & request("date") &"' and 录入员 ='" & request("user") & "'"
这里我假设id类型为自动编号,date表示时间字段(类型日期),user表示录入员(类型文本)
不知道楼主是这个意思吗?
#5
zhongx2007-08-30 20:37
id类型为不是自动编号呢?
首页按照单条件查询方法再传递关键字入是吗?
#6
aipb2O072007-08-30 20:48
以下是引用madpbpl在2007-8-30 20:28:41的发言:
select * from [tablename] where 编号="& request("id") &" and 日期='" & request("date") &"' and 录入员 ='" & request("user") & "'"
这里我假设id类型为自动编号,date表示时间字段(类型日期),user表示录入员(类型文本)
不知道楼主是这个意思吗?

这个……条件关联不对吧?


按说如果我id都确定了 其他的条件就不需要了哦

#7
multiple19O22007-08-30 20:54
dim sql
dim rs
sql="select * from [tablename] where 1=1"

if request("id")<>"" and isnumberic(request("id")) then
sql=sql & " and 编号=" & request("id")
else
if request("date")<>"" then sql=sql & " and 日期='" & replace(request("date"),"'","''") & "'"
if request("user")<>"" then sql=sql & " and 录入员='" & replace(request("user"),"'","''") & "'"
end if
response.write sql
set rs=conn.execute sql
#8
madpbpl2007-08-30 21:13
以下是引用aipb2O07在2007-8-30 20:48:17的发言:

这个……条件关联不对吧?


按说如果我id都确定了 其他的条件就不需要了哦

应该是我说的不够恰当。
改成id类型为数字。

#9
shenlang92007-08-30 21:44
如果是这样呢???
有5个字段 gname dizhi dianhua name chanpin
分别对应 公司名称 地址 电话 联系人 产品
其中 "产品" 里有1 2 3 4... 等多个产品

"地址"里有 北京 上海 广州 三个

搜索的时候 分 按 "产品" 和"地址"收缩
"产品"搜索的时候 输入关键字 比如说 1或2或3或.....(产品搜索是关键字)
"地址"搜索的时候 有下拉菜单 全部搜索 北京搜索 上海搜索 广州搜索 (地址搜索是下拉菜单)

比如搜索 "1 全部" 显示"产品"中含有"1"的全部信息
搜索"1 上海" 显示"产品"且在"上海"的全部信息

怎么实现?????
#10
madpbpl2007-08-30 23:55

楼上说的有点复杂
提交表单这样写
<form name="form1" method="post" action="search.asp">
<input type="text" name="keyword">
<select name="dizhi">
<option value="" selected>请选择地市</option>
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="广州">广州</option>
</select>
<input type="submit" name="submit1" value="搜索">
</form>

search.asp 假设数据库链接文件为conn.asp
<!--#include file="conn.asp"-->
<%
keyword=request("keyword")
dizhi=request("dizhi")
if keyword="" then
response.write "<script language='javascript'>alert('关键字不能为空!');history.go(-1);<script>"
end if
set rs=Server.CreateObject("adodb.recordset")
if dizhi="" then
sql ="select * from [table] where chanpin like '%" & keyword & "%'"
else
sql ="select * from [table] where chanpin like '%" & keyword & "%' and dizhi='" & dizhi & "'"
end if
rs.open sql,conn,1,1
%>
...... '余下楼上自己补充

#11
shenlang92007-08-31 01:00
谢谢楼上了   再研究一下
#12
multiple19O22007-08-31 06:34
以下是引用madpbpl在2007-8-30 21:13:52的发言:

应该是我说的不够恰当。
改成id类型为数字。

我说的是那个sql语句不合理。既然连ID都需要了,别的条件也无需限制了。这个回答和问题不对应。

当然可以开放通过ID号查找,但这不和别的条件同时用,因为不需要。

#13
madpbpl2007-08-31 09:52
以下是引用multiple19O2在2007-8-31 6:34:01的发言:

我说的是那个sql语句不合理。既然连ID都需要了,别的条件也无需限制了。这个回答和问题不对应。

当然可以开放通过ID号查找,但这不和别的条件同时用,因为不需要。

可以这样理解,ID只是数据库表中的一个字段,并不是我们习惯用的设为自动编号的主键ID。

#14
multiple19O22007-08-31 10:17
以下是引用madpbpl在2007-8-31 9:52:27的发言:

可以这样理解,ID只是数据库表中的一个字段,并不是我们习惯用的设为自动编号的主键ID。

居然还有谁的数据库结构这么建……ID居然可以重复……

#15
madpbpl2007-08-31 10:28
以下是引用multiple19O2在2007-8-31 10:17:06的发言:

居然还有谁的数据库结构这么建……ID居然可以重复……

假设有一个guest表,我们可以设g_id为主键,而id只是这个表中的一个字段,这样有何不可呢?
不要用我们固定、习惯的模式来看问题吧?
感觉楼上很强,怎么一时绕不过弯来

#16
piaoxue2007-08-31 12:15
以下是引用shenlang9在2007-8-30 21:44:11的发言:
如果是这样呢???
有5个字段 gname dizhi dianhua name chanpin
分别对应 公司名称 地址 电话 联系人 产品
其中 "产品" 里有1 2 3 4... 等多个产品

"地址"里有 北京 上海 广州 三个

搜索的时候 分 按 "产品" 和"地址"收缩
"产品"搜索的时候 输入关键字 比如说 1或2或3或.....(产品搜索是关键字)
"地址"搜索的时候 有下拉菜单 全部搜索 北京搜索 上海搜索 广州搜索 (地址搜索是下拉菜单)

比如搜索 "1 全部" 显示"产品"中含有"1"的全部信息
搜索"1 上海" 显示"产品"且在"上海"的全部信息

怎么实现?????

不对吧 我感觉搂上说的意思是 多表之间的查询情况吧! 在一个表里没有办法实现搂上的这个功能!

#17
shenlang92007-08-31 12:31
to piaoxue
谢谢 不过你可能没有理解我的意思

我再说详细点 你帮我研究一下
数据库nb.mdb中有nb这个表
表nb中
公司名称 地址 电话 联系人 产品
(第一列) A 上海 1234567 张三 1 2 3 4 (四种产品)
(第二列) B 北京 7654321 李四 2 3 6 8(四种产品)
我想搜 地址为"上海" 产品 2 的时候
显示出来为只要 "地址"为"上海" "产品"里含有2这个产品的全部信息

我想搜 地址为 "全部" 产品 3 的时候
显示出来为 只要 "产品"中含有3这个产品的全部信息

这下够详细了吧 呵呵
希望大家能给一个初学者一点帮助!!!!!!!!谢谢
#18
zhongx2007-08-31 12:53


<form name="form1" method="post" action="search.asp">
条件1:<input type="text" name="A">[A为文本类型](可以为空,当关键字为空时,代表所有关键字.)<br>
条件2:<input type="text" name="B">[B为日期类型](可以为空,当关键字为空时,代表所有关键字.)<br>
条件3:<input type="text" name="C">[C为文本类型](可以为空,当关键字为空时,代表所有关键字.)<br>
条件4:<input type="text" name="D">[D为文本类型](可以为空,当关键字为空时,代表所有关键字.)<br>
<input type="submit" name="submit1" value="搜索">
</form>

(当所有关键字都为空时,显示全部数据.)

==== 这个又怎样写 search.asp 呢? 请教大哥们... ===

#19
multiple19022007-08-31 13:00
以下是引用madpbpl在2007-8-31 10:28:09的发言:

假设有一个guest表,我们可以设g_id为主键,而id只是这个表中的一个字段,这样有何不可呢?
不要用我们固定、习惯的模式来看问题吧?
感觉楼上很强,怎么一时绕不过弯来

大概是这样吧,我逆向思维很不好使的 呵呵

我的想法是 不管id是不是主键,id字段的作用是唯一确定一条记录(因为一般都是这么用的啊)

当然了,如你所说,id当然可以重复

所以我之前表达的意思是,如果老师需要在班上确定一位同学,给出学号就足够了,无需再给出其他信息,那样显得多余:“学号为xx的姓yy的同学来一下”

#20
madpbpl2007-08-31 13:12
以下是引用shenlang9在2007-8-31 12:31:41的发言:
to piaoxue
谢谢 不过你可能没有理解我的意思

我再说详细点 你帮我研究一下
数据库nb.mdb中有nb这个表
表nb中
公司名称 地址 电话 联系人 产品
(第一列) A 上海 1234567 张三 1 2 3 4 (四种产品)
(第二列) B 北京 7654321 李四 2 3 6 8(四种产品)
我想搜 地址为"上海" 产品 2 的时候
显示出来为只要 "地址"为"上海" "产品"里含有2这个产品的全部信息

我想搜 地址为 "全部" 产品 3 的时候
显示出来为 只要 "产品"中含有3这个产品的全部信息

这下够详细了吧 呵呵
希望大家能给一个初学者一点帮助!!!!!!!!谢谢

不知道我前面写的应该对你有用吧
按你现在的说法,只要写成
sql ="select * from nb where 产品 like '%" & 3 & "%'"
就可以了,或者把3改成你传过来的参数
假设传过来的参数为chanpin
只要改成
sql ="select * from nb where 产品 like '%" & request("chanpin") & "%'"
即可。
具体根据你的情况稍做调整

#21
madpbpl2007-08-31 13:19
以下是引用zhongx在2007-8-31 12:53:31的发言:


<form name="form1" method="post" action="search.asp">
条件1:<input type="text" name="A">[A为文本类型](可以为空,当关键字为空时,代表所有关键字.)<br>
条件2:<input type="text" name="B">[B为日期类型](可以为空,当关键字为空时,代表所有关键字.)<br>
条件3:<input type="text" name="C">[C为文本类型](可以为空,当关键字为空时,代表所有关键字.)<br>
条件4:<input type="text" name="D">[D为文本类型](可以为空,当关键字为空时,代表所有关键字.)<br>
<input type="submit" name="submit1" value="搜索">
</form>

(当所有关键字都为空时,显示全部数据.)

==== 这个又怎样写 search.asp 呢? 请教大哥们... ===

这个就比较烦了,要分多种情况考虑
A=request.form("A")
B=request.form("B")
C=request.form("C")
D=request.form("D")
set rs=Server.CreateObject("adodb.recordset")
if A="" and B="" and C="" and D=""
sql="select * from [table]" '显示整个表的数据
elseif A<>"" and B="" and C="" and D=""
sql="select * from [table] where condition"
elseif....
sql=....
end if
rs.open sql,conn,1,1
.....

#22
madpbpl2007-08-31 13:22
以下是引用multiple1902在2007-8-31 13:00:27的发言:

大概是这样吧,我逆向思维很不好使的 呵呵

我的想法是 不管id是不是主键,id字段的作用是唯一确定一条记录(因为一般都是这么用的啊)

当然了,如你所说,id当然可以重复

所以我之前表达的意思是,如果老师需要在班上确定一位同学,给出学号就足够了,无需再给出其他信息,那样显得多余:“学号为xx的姓yy的同学来一下”

我明白你的意思,你这样做是一个很好的习惯,数据多了不会混淆。

#23
zhongx2007-08-31 14:39
以下是引用madpbpl在2007-8-31 13:19:37的发言:

这个就比较烦了,要分多种情况考虑
A=request.form("A")
B=request.form("B")
C=request.form("C")
D=request.form("D")
set rs=Server.CreateObject("adodb.recordset")
if A="" and B="" and C="" and D=""
sql="select * from [table]" '显示整个表的数据
elseif A<>"" and B="" and C="" and D=""
sql="select * from [table] where condition"
elseif....
sql=....
end if
rs.open sql,conn,1,1
.....

你是以下的意思吗?

<%
'这个就比较烦了,要分多种情况考虑
A=request.form("A")
B=request.form("B")
C=request.form("C")
D=request.form("D")
set rs=Server.CreateObject("adodb.recordset")
if A="" and B="" and C="" and D="" then '当所有关键字为空时
sql="select * from [table]" '显示整个表的数据
elseif A<>"" and B="" and C="" and D="" then
sql="select * from [table] where condition"
elseif A="" and B<>"" and C="" and D="" then
sql="select * from [table] where condition"
elseif A="" and B="" and C<>"" and D="" then
sql="select * from [table] where condition"
elseif A="" and B="" and C="" and D<>"" then
sql="select * from [table] where condition"
end if
rs.open sql,conn,1,1
%>
<% do while not rs.eof%>
<%=rs("A")%><%=rs("B")%><%=rs("C")%><%=rs("D")%><%=rs("E")%>
<%
rs.movenext
loop
%>




#24
madpbpl2007-08-31 16:59
condition要根据你的情况改成具体的条件,大概就是这个意思。
#25
zhongx2007-08-31 17:20
其他语句有错误吗?
测试结果是:全部为空正确,全部有关键字时不正确,任一条件下有关键字时不正确.
condition ???
#26
madpbpl2007-08-31 17:28
condition就是条件的意思,不存在这样的写法,只是把condition换成你的条件
举个例子:全部有关键字时
if A<>"" and B<>"" and C<>"" and D<>"" then
sql ="select * from [table] where A like '%" & request("A") & "%' and B like '%" & request("B") & "%' and C like '%" & request("C") & "%' and D like '%" & request("D") & "%'"
else
.....
end if
前面的A、B、C、D是你数据库中的字段,后面的request A、B、C、D(偷懒,简写了,实际写法见上面sql语句)是你传过来的值
#27
zhongx2007-08-31 18:00
这样写功能可以实现,但判断句就很多......

原来的我漏掉了like无写.
#28
zhongx2007-08-31 18:03
怪不得你会说:"这个就比较烦了,要分多种情况考虑"

#29
zhongx2007-08-31 18:18
查询速度好像很慢呀!现在的库中才只有三条数据,数据多了怎么办呢?

有办法优化吗? 或还有其它办法吗?

辛苦你了!!!
#30
multiple19O22007-08-31 18:55
sql="select * from chanpin where 1=1"
if request("xxx")<>"" then sql=sql & " and xxx like '%" & request("xxx") & "'"


没人用这种“1=1 and”的写法么
#31
madpbpl2007-08-31 19:03
楼上的方法不错,可以借签。我也学习一下,这种写法基本上没用过。
#32
zhongx2007-08-31 20:14
以下是引用multiple19O2在2007-8-31 18:55:11的发言:
sql="select * from chanpin where 1=1"
if request("xxx")<>"" then sql=sql & " and xxx like '%" & request("xxx") & "'"


没人用这种“1=1 and”的写法么

按照你的方法,我先去测试一下.

之前你也帮写过段代码,可行.

在先谢谢你和madpbpl !!!

#33
multiple19O22007-08-31 20:45
以下是引用zhongx在2007-8-31 20:14:40的发言:

按照你的方法,我先去测试一下.

之前你也帮写过段代码,可行.

在先谢谢你和madpbpl !!!

话说我刚才一直觉得我好像回复过这个技巧的……但又没找着……所以再写了一遍

奇怪……

#34
zhongx2007-08-31 20:57
之前你回复过这个技巧的不过不是现在的这个问题,而是针对之前的问题.

今次由于个人水平问题,测试不出结果,如果可以的话,最好能详尽些...
1