2016-07-28 57 views
0

我想寫以下查詢......MySQL的多個參數查詢

SELECT SQL_CALC_FOUND_ROWS * FROM calls 
WHERE id IS NOT NULL 
AND account_name LIKE '%$account_search%' 
AND name LIKE '%$adv_term_det%' OR description LIKE '%$adv_term_det%' 
AND type != 'online' 
AND marked_completed_by = '' 
ORDER BY $sort_by DESC LIMIT $page_position, $item_per_page 

但結果不是預期值。我懷疑該生產線是導致該問題的是..

AND name LIKE '%$adv_term_det%' OR description LIKE '%$adv_term_det%' 

我懷疑應該是一個子查詢,但幾經嘗試用IN我沒有能夠使它發揮作用。

SELECT SQL_CALC_FOUND_ROWS * FROM calls 
WHERE call_ref IN 
    (SELECT call_ref FROM calls 
    WHERE name LIKE '%$adv_term_det%' OR description LIKE '%$adv_term_det%' 
) 
AND id IS NOT NULL 
AND account_name LIKE '%$account_search%' 
AND type != 'online' 
AND marked_completed_by = '' 
ORDER BY $sort_by DESC LIMIT $page_position, $item_per_page; 

基本上我想返回滿足所有其他標準,並在任一namedescription以及具有$adv_term_det所有記錄。

如果我只使用AND name LIKE '%$adv_term_det%'我得到我期望該查詢的結果,同樣,如果我只使用AND description LIKE '%$adv_term_det%'但我需要找到一個有記錄「的%$adv_term_det%'要麼namedescription

回答

1

無論你是不是非常有經驗用複雜的布爾邏輯或者你錯過了錯誤。無論哪種情況,我建議您使用括號,特別是在混合ANDOR時。我認爲這是你打算的邏輯:

WHERE (id IS NOT NULL) AND 
     (account_name LIKE '%$account_search%') AND 
     (name LIKE '%$adv_term_det%' OR description LIKE '%$adv_term_det%') AND 
     (type <> 'online') AND 
     (marked_completed_by = '') 

另外請注意,將變量直接插入到SQL字符串中是危險的。你應該使用參數來達到這個目的。

+0

謝謝,效果很好。我確實是一個每天都在進步和學習的工作。我知道爲其他語言的查詢添加括號,但不知道您也可以在SQL中使用它們。只是出於好奇,你能澄清你的意思是什麼參數而不是變量? – tatty27

+0

嗯。 。 。開始的地方是參數化查詢。在進行應用程序開發時這很重要。如果你現在只是在玩耍,那麼這可能是一個混亂。但是,在某些時候,您應該瞭解SQL注入,動態SQL和參數化查詢。 –