2017-05-07 41 views
0

如果我沒有錯誤,當使用有,查詢執行沒有任何過濾器,然後代碼遍歷所有結果應用過濾器。但在這種情況下,我使用多個贊//如果計算我的訂單。我想知道什麼之間會更好:WHERE vs HAVING計算字段與多個IF/LIKE

SELECT Page.*, 

if (`flags` LIKE CONCAT('%',?,'%'), 

    if (`title` LIKE CONCAT('%',?,'%'), 
     5, 
     3 
    ), 

    if (`title` LIKE CONCAT('%',?,'%'), 
     2, 
     0 
    ), 
) as pageOrder 

FROM Page 

WHERE `flags` LIKE CONCAT('%',?,'%') OR `title` LIKE CONCAT('%',?,'%') 

ORDER BY pageOrder DESC 

SELECT Page.*, 

if (`flags` LIKE CONCAT('%',?,'%'), 

    if (`title` LIKE CONCAT('%',?,'%'), 
     5, 
     3 
    ), 

    if (`title` LIKE CONCAT('%',?,'%'), 
     2, 
     0 
    ), 
) as pageOrder 

FROM Page 

HAVING pageOrder > 0 

ORDER BY pageOrder DESC 

用mysql 5.7和PHP 7.1

回答

1

這種情況下,沒有太大的區別。這是一個分析。

  • 由於沒有索引可用於任一WHEREORDER BY,整個表將(對於製劑)進行掃描。

  • 表達式通常是整個查詢的一小部分,所以通常我會忽略LIKEs。但是,在這種情況下,對於每一行,您都在做3-4 LIKEs,對於WHERE方法,大約是LIKEs的兩倍,所以它可能會稍微慢一些。

  • 其中一個可能認爲WHERE更具可讀性。

  • Page的所有行(大部分行)都將被移植到tmp表中。但我沒有看到兩種方法之間的巨大差異。另外,我不一定能找到避免這個問題的方法。

這裏是制定pageOrder表達更爲簡潔,但不是更快,道:

3 * (`flags` LIKE CONCAT('%',?,'%') + 
    2 * (`title` LIKE CONCAT('%',?,'%')