一種替代方法是在SELECT列表的表達式中測試條件。
我認爲最簡單的解釋方法就是舉例。但是我不能良心發表容易受SQL注入影響的示例代碼。
目前查詢:
SELECT a.*
FROM articles
WHERE a.`title` LIKE CONCAT('%', ? ,'%')
OR a.`description` LIKE CONCAT('%', ? ,'%')
OR a.`tags` LIKE CONCAT('%', ? ,'%')
ORDER
BY a.dateadded
當前查詢,我們可以添加表情到SELECT列表。舉例:
SELECT IF(a.`title` LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_title
, IF(a.`description` LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_description
, IF(a.`tags` LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_tags
, a.*
FROM articles
WHERE a.`title` LIKE CONCAT('%', ? ,'%')
OR a.`description` LIKE CONCAT('%', ? ,'%')
OR a.`tags` LIKE CONCAT('%', ? ,'%')
ORDER
BY a.dateadded
對於返回的每一行,都會計算SELECT列表中的表達式。條件測試(LIKE
比較)評估爲TRUE,FALSE或NULL。 MySQL IF
函數會將第一個參數評估爲布爾值,如果是,則返回第二個參數,elise返回第三個參數。
在此示例中,如果匹配,則表達式返回1
。否則,它將返回0
。還有很多其他選擇我們可以返回的值。我們還可以在單個表達式中組合條件,以返回單個值。
還有很多可能的表達式可以包含條件測試。我剛剛使用了MySQL IF
函數。更符合ANSI標準的表達式可以使用CASE
,例如,
SELECT CASE WHEN a.`title` LIKE CONCAT('%', ? ,'%')
THEN 1
ELSE 0
END AS match_in_title
一個稱爲標籤欄的存在通常是對症的設計不良。 – Strawberry
您可以使用UNION來解決您的問題 – Strawberry
是的我知道列名稱並不完美。我將它們重命名爲使事情變得簡單,以便更容易地提出我的問題。 – Born2DoubleUp