2011-04-27 75 views
0

我有一个搜索表单,用户可以输入和搜索记录。在搜索栏的搜索关键词是这种形式:光滑,木材,38 现在的实际问题是一个关键词返回的记录,当用户键入时,他在第二个关键词类型,记录被返回,但是与该搜索不匹配的旧记录也被返回。 如果他在38型,木这样两个记录返回,但是当他冲型,逻辑上只有一条记录应返回,但它不,它返回的蓝色的为好。 *每当用户对SEARCH_KEYWORD或第二关键字输入,3关键字结果应根据搜索词进行过滤和遗憾的是没有做这样的*。 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所以无论结果现在应该显示当他输入红色/蓝色或2500分之2600那么结果应该是一个。

查询这个样子的:

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;} 
} 
+0

这似乎是一个合并错误。只要删除外部循环。 – SlavaGu 2011-04-27 15:06:41

+0

@SlavaGu我已经拿出了外部循环,但我仍然得到了混淆结果:( – safi 2011-04-27 15:12:46

回答

3

当你问访问数据库引擎来运行此查询...

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 

然而,看着为table1的样本数据,没有记录包含的全部三个SEARCH_KEYWORD字段中输入检索词。因此,也许你真的想要或代替那些WHERE子句conditons之间:

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查询,尝试这两个,让我们知道会发生什么,当你在访问,而不是从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] 

基于你向我们展示了样本数据,第一个查询应返回任何记录,第二个应该返回几个。

+0

当我把列名,然后没有结果返回。我已经试过这在访问,如果你把'列名和如果你这样做:'从table1中选择名称,其中search_keyword类似于'%smooth%'和'%wood%''那么返回值,但该记录仅被第一个和第二个'%wood%',如果我放或结果不完全是search_keyword。 – safi 2011-04-28 08:44:05

+0

@safi我在答案中增加了更多的信息。你可能被Access误用了通配符问题。像)比较所以Access会接受ANSI%通配符而不是\ *字符,如果你愿意,我们可以详细讨论这个问题 – HansUp 2011-04-28 13:36:51

+0

我已经阅读过你之前的文章,我也使用过但是在访问时如果我像'和Column_name像%blue%和Column_name如%red%',那么访问不会考虑它。所以我必须避免第二个column_name提到。编辑过的2节已经解决了这个问题。 – safi 2011-04-28 20:22:43