2017-08-28 15 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"; 

:結果で

$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た(変数@end_trial_dateを使用して)、何も見つかりませんでした。

このクエリを短縮するにはどうすればよいですか?

+0

これは複雑なクエリで、データベースの構造やクエリのポイントがわかりません。私はあなたに私達に詳細を与えなければならないと思う、またはあなたは(良い)答えを得られないだろう。 –

+0

@KIKOSoftware私はそれを単純化できると思う。 私には大きな問題があります。変数にIF STATEMENTを代入すると、結果にNULLが表示されます。 私はそれがcomparsionの瞬間に割り当てられていないようだと思った。 –

+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句'内の未知の列 'end_trial_date' –

+0

はい、私はそのようなことを恐れていました。 selectの式は、whereの処理が完了した後にのみ評価されます。 –

+0

また、where句で変数を設定しようとしました。 しかし、期待通りに動作しませんでした。 NULLではなく空の行だけです。 (見つかったが、完全に空のフィールドを持つ) –