2017-08-28 68 views
0

我有一個用PHP形成的大型MySQL查詢。
我不喜歡這個大IF語句在查詢中重複4次(保存在$endTrialDate變量中)。正確使用MySQL變量

我想使它更短,更好,只是使用MySQL變量。

我查詢(編輯和簡體)

$endTrialDateCondition = "IF(ec.extend_trial_type LIKE 'week', 
     ADDDATE(ec.start_contract, (7 * ec.extend_trial_time)), 
      IF(ec.extend_trial_type LIKE 'day', 
      ADDDATE(ec.start_contract, ec.extend_trial_time), 
      ADDDATE(ec.start_contract, INTERVAL ec.extend_trial_time MONTH) 
     ) 
     )"; 

$endTrialDate = "(SUBDATE((".$endTrialDateCondition."), 1))"; 

$finalQuery = "SELECT e.firstname_employe, e.lastname_employe, 
    ".$endTrialDate." as end_trial_date 
    FROM employe_contract ec 
    LEFT JOIN employe e ON ec.id_employe = e.id_employe 
    WHERE ".$endTrialDate." >= ? 
    AND ".$endTrialDate." <= ? 
    ORDER BY ".$endTrialDate.", e.lastname_employe, e.firstname_employe"; 

當我想修改我的查詢,如:(使用可變@end_trial_date)

$finalQuery = "SELECT e.firstname_employe, e.lastname_employe, 
    @end_trial_date := ".$endTrialDate." as end_trial_date 
    FROM employe_contract ec 
    LEFT JOIN employe e ON ec.id_employe = e.id_employe 
    WHERE @end_trial_date >= ? 
    AND @end_trial_date <= ? 
    ORDER BY @end_trial_date, e.lastname_employe, e.firstname_employe"; 

end_trial_date的結果是NULL,所以沒有發現。

如何縮短查詢時間?

+0

這是一個複雜的查詢,我們不知道你的數據庫是如何構造的或者查詢的重點是什麼。我認爲你要麼給我們更多的細節,要麼你不會得到(好的)答案。 –

+0

@KIKOSoftware我認爲我可以簡化這一點。 我有的主要問題。當我將IF STATEMENT分配給變量時,它會在結果中顯示NULL。 我認爲這是在比較的時刻沒有分配。 –

+0

我不確定,但我認爲MySQL中的變量是全局變量,並且不能像你一樣逐行地在「SELECT」查詢中使用它們。或者,換句話說:在所有行被選中之後執行'ORDER BY',所以變量不會有你期望的內容。 –

回答

1

你能試試這個:

$finalQuery = "SELECT e.firstname_employe, e.lastname_employe, 
".$endTrialDate." as end_trial_date 
    FROM employe_contract ec 
    LEFT JOIN employe e ON ec.id_employe = e.id_employe 
    WHERE end_trial_date >= ? 
    AND end_trial_date <= ? 
    ORDER BY end_trial_date, e.lastname_employe, e.firstname_employe"; 

我不知道這會執行,但它比你有什麼更好的。基本上,as爲您提供了逐行工作的變量。

+0

謝謝,但那不行。 'where clause'中的未知列'end_trial_date' –

+0

是的,我害怕這樣的事情。 select中的表達式僅在完成where操作後才被評估。 –

+0

我也試着在where子句中設置變量。 但它也沒有按預期工作。不是NULL,而只是空行。 (找到了1個,但是全部爲空) –