2012-08-14 89 views
1

我試圖做一個SQL表中的「模糊」搜索與人的名字:MySQL的搜索查詢逗號分隔名稱

這是表:

+----+------------+ 
| T1 | T2   | 
+----+------------+ 
| 1 | Last,First | 
| 2 | Last,First | 
| 3 | Last,First | 
+----+------------+ 

我希望得到一個選擇在那裏我查詢T2LIKE操作的語句,它的工作原理,甚至當你的查詢是「第一個最後」

我能想到的唯一方法是通過分割值並連接它們,然後再次搜索條目。有一個更好的方法嗎?

回答

5

是,如果有一種可能性,你可以將兩者last, firstfirst last到數據庫中,更好的方法是正確的設計架構。

如果曾經發現自己想搜索的,或以其他方式操縱,部分列,你的方案几乎可以肯定是壞。它幾乎肯定會殺死性能。

正確的方法是有這樣的表:

T1 FirstName LastName 
== ========= ======== 
1 Pax  Diablo 
2 Bob  Smith 
3 George  Jones 

然後你就可以更細緻地劃分用戶輸入的域名(一次,運行查詢之前),而不是試圖每一個名字的拆分數據庫。


在該數據庫始終保持last, first的情況下,實際上也可能沒有一個架構更改是必要的。

你在這種情況下的問題只是解釋用戶輸入的內容之一。

一種可能性,儘管它是一個性能殺手,但是對每個單獨的單詞都要做like。因此,如果用戶輸入pax diablo,你得到的查詢可能是:

select T1 from mytable 
    where T2 like '%pax%' 
     and T2 like '%diablo%' 

這樣,你不關心順序這麼多。但是,鑑於我不喜歡慢速查詢,除非絕對必要(或者您的數據庫相對較小並且可能保持這種方式),否則我會盡量避免這種情況。

有各種各樣的方式來加快這些類型的查詢,如:使用任何全文搜索功能,你的DBMS有

  • 通過在插入/更新觸發器中提取和存儲單詞(並在刪除觸發器中刪除它們)來模擬此類功能。
  • 以前的情況,但也確保使用與當前列(速度)的較小的值的額外的列。
  • 告訴用戶他們需要使用last, first表單進行搜索。
  • 儘量避免%something%搜索字符串儘可能(與something%,索引仍然可以使用)。
  • 我以前提到「分成兩列」的方法。
+0

肯定同意。應該提到,在這篇文章中,我意識到這是發佈之前的模式。 – Kartik 2012-08-14 03:06:50

1

你可以試試這個。但更好的是通過分隔名字來重構你的表格模式。

SELECT * 
FROM myTable 
WHERE T2 LIKE CONCAT('%', 'First', '%','Last', '%') OR 
     T2 LIKE CONCAT('%', 'Last', '%','First', '%')