web項目中經常會碰到整站搜索的問題,即客戶希望在網站的搜索框中輸入一個詞語,然後在整個網站中只要包含這個詞的頁面都要出現在搜索結果中。由於一個web項目不可能用一張表就全部搞定的,所以這裡一般都是要用union聯合搜索來解決整個問題的。
下面列舉一下本次使用的union聯合搜索的sql語句,方便下次備忘。
select * from (SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND `subject` LIKE '%調整圖片%' ORDER BY `add_time` DESC) as t1 union all select * from (SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`='1' AND `class_name` LIKE '%調整圖片%' ORDER BY `class_id` DESC) as t2 union select * from (SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND (`subject` LIKE '%調整%' OR `subject` LIKE '%圖片%') ORDER BY `add_time` DESC) as t3;
以上SQL語句的聯合查詢主要用到了union all和union,至於這兩者的區別就是union all會列舉所有符合條件的查詢結果,而union會將所有符合條件的查詢結果做一下去除重復結果的篩選。
對於以上SQL語句的解釋就是由於article表和web_class表分屬兩個不同的表,所以這裡不用去除重復結果。然而以上聯合查詢的第三個分支的sql查詢語句是由分詞然後組合出來的查詢語句,這條sql語句查詢的結果是肯定包含第一個分支sql語句的查詢結果的,這裡就顯得沒必要了,所以沒有使用all而去掉重復的查詢結果。