问题描述
|
我有一个搜索表单,用户可以在其中输入和搜索记录。搜索栏中的搜索关键字采用以下形式:“平滑”,“木材”,“ 38”
现在的实际问题是,当用户键入一个关键字时返回一条记录,而当他键入第二个关键字时,返回一条记录,但是还返回了与搜索不匹配的旧记录。
如果他输入38,wood,那么将返回两条记录,但是当他输入红色时,逻辑上仅应返回一条记录,但不会,并且也将返回蓝色。
*每次用户输入search_keyword或2nd关键字,3rd关键字时,都应根据搜索词过滤结果,但不幸的是,结果并非如此*。
table1结构如下:
id path name search_keyword
1 c:\\my picture\\ red door red;
2 c:\\my picture\\ red door 38;
3 c:\\my picture\\ red door wood;
4 c:\\my picture\\ red door 2500;
5 c:\\my picture\\ red door smooth
6 c:\\my picture\\ blue door blue ;
7 c:\\my picture\\ blue door 38;
8 c:\\my picture\\ blue door wood;
9 c:\\my picture\\ blue door 2600;
19 c:\\my picture\\ blue door smooth;
该表包含搜索关键字,用户可以在其中输入search_keyword并获得结果过滤器(多个搜索关键字);
假设他输入开始平滑木头38,那么当他输入红色/蓝色或2600/2500时,两个结果现在都应该显示,那么结果应该是1。
查询如下所示:
select distinct name from table1 where search_keyword like \'%smooth%\' And \'% wood %\' and \'%red%\' order by name
以下代码:
publi override list<result> retrunsearch(string search)
{
string[] search = pQuery.Split(\',\');
List <result> myresult = new List<result>();
for (int i = 1; i < search.Length; i++)
{
StringBuilder query = new StringBuilder();
query.Append(
string.Format(\"SELECT disTINCT name,path FROM table1 WHERE search_keyword LIKE \'%{0};%\'\",search[0])
);
// Add extra keywords
for (int i = 1; i < search.Length; i++)
{
query.Append(string.Format(\" And \'%{0};%\'\",search[i]));
}
// Add order by
query.Append(\" ORDER BY name\");
using (OleDbCommand command = new OleDbCommand(query.ToString(),sqlconConnection))
{
command.CommandType = CommandType.Text;
using (OleDbDataReader sdaResult0 = command.ExecuteReader())
{
while (sdaResult0.Read())
{
result restult1= new result();
result1.name = sdaResult0.String(0);
myresult.add(result1);
}
sdaResult0.Close();
}
}
return myresult;
}
public class result{
public result()
{
}
public string name{get;set;}
}
解决方法
当您要求Access的数据库引擎运行此查询时...
select Distinct name from table1 where search_keyword like \'%smooth%\' And \'% wood %\' and \'%red%\' order by name
...我认为它给您的结果将与您要求它运行此查询的结果相同...
select Distinct name
from table1
where
search_keyword like \'%smooth%\'
And True
and True
order by name
对于WHERE子句中的每个ANDed条件,您必须告诉它要与之比较的字段以及所需的比较类型。
select Distinct name
from table1
where
search_keyword like \'%smooth%\'
And search_keyword like \'% wood %\'
and search_keyword like \'%red%\'
order by name
但是,查看表1的样本数据,没有记录包含search_keyword字段中的所有三个搜索字符串。所以也许您真的想要在那些WHERE子句条件之间使用OR而不是AND:
select Distinct [name]
from table1
where
search_keyword like \'%smooth%\'
OR search_keyword like \'% wood %\'
OR search_keyword like \'%red%\'
order by [name]
我还将名称括在方括号中,因为名称是MS Access中的保留字。
编辑:另外,我想知道您是否真的想要木材前后的空间。如果没有,请尝试这种方式:
OR search_keyword like \'%wood%\'
Edit2:由于您的注释指示您可以直接在Access中尝试查询,因此请尝试这两个,并让我们知道在Access中而不是从c#运行它们时发生的情况。
SELECT DISTINCT [name]
FROM table1
WHERE
search_keyword ALike \'%smooth%\'
AND search_keyword ALike \'%wood%\'
AND search_keyword ALike \'%red%\'
ORDER BY [name]
SELECT DISTINCT [name]
FROM table1
WHERE
search_keyword ALike \'%smooth%\'
OR search_keyword ALike \'%wood%\'
OR search_keyword ALike \'%red%\'
ORDER BY [name]
根据您显示给我们的样本数据,第一个查询应不返回任何记录,第二个查询应返回多个记录。