SQL 語法 SELECT Full Text Index + Sub-query (Subselect)

SQL 可以透過 SELECT + WHERE + LIKE 可以針對 CHAR, VARCHAR, 以及 TEXT 指定欄位 (COLUMN) 做關鍵字來比對搜尋 ( 需注意資料庫字元編碼 Character Sets 與 文字排序 Collations ,請參考資料庫編碼 – http://benjr.tw/102156 ).

MariaDB [testdb]> SELECT * FROM Employee WHERE Expertise LIKE '%python%';

但比對的時候只能針對指定欄位來搜尋 (Search) ,有辦法可以針對所有欄位來做搜尋嗎? 這時後可以透過建立 Full Text Index 來做.在使用 SELECT 做搜尋資料時搭配 MATCH (col1,col2,…) AGAINST (expr [search_modifier]) 即可針對已建立 Full Text Index 的欄位來搜尋.

測試環境為 CentOS 7 x86_64 (虛擬機),MySQL ENGINE 選擇的是 MyISAM, InnoDB 需要到 MySQL 5.6 之後的版本才有支援 FULLTEXT indexes.

SELECT Full Text Index MATCH AGAINST 基礎用法請參考 – http://benjr.tw/101644

Full Text Index

針對 A , B 欄位,搜尋與 ‘apple , banana’ 這兩個相關字串的內容.

MariaDB [(none)]> SELECT * FROM testdb.Employee WHERE MATCH (A , B) AGAINST ('apple , banana');

Full Text Index + Sub-query

子查詢 (sub-query) 為 一段 SQL 語法中內還包含一段 SELECT ( SELECT 敘述需置於 左右刮號 中).適合使用於當 AGAINST 搜尋相關字串的內容是儲存在另外一個資料表 (Table) 時.

MariaDB [(none)]> SELECT * FROM testdb.Employee WHERE MATCH (A , B) AGAINST ((SELECT content FROM testdb.content WHERE id=68));

但當 SELECT 中包含多個欄位 columns 時,不能直接使用.

MariaDB [(none)]> SELECT * FROM testdb.Employee WHERE MATCH (A , B) AGAINST ((SELECT conten1 , content2 FROM testdb.content WHERE id=68));
ERROR 1241 (21000): Operand should contain 1 column(s)

可以利用函數 CONCAT_WS 函數 (請參考 http://benjr.tw/101970 ) 可以將兩個或更多個字串連接在一起,並加上固定的分隔字元..

MariaDB [(none)]> SELECT * FROM testdb.Employee WHERE MATCH (A , B) AGAINST ((SELECT CONCAT_WS(" ", conten1 , content2) FROM testdb.content WHERE id=68));

或是利用多次的 MATCH () AGAINST () + MATCH () AGAINST ()

MariaDB [(none)]> SELECT * FROM testdb.Employee WHERE MATCH (A , B) AGAINST ((SELECT conten1 FROM testdb.content WHERE id=68)) + MATCH (A , B) AGAINST ((SELECT content2 FROM testdb.content WHERE id=68));
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料