2011-04-27 37 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