2017-06-01 51 views
0

WHERE節でフィルタリングしたデータを表示したい。私は条件値の代わりにいくつかの変数を適用しましたが、今は条件が適用されない場合にデータを取得する方法を説明します。私はそれを試みたが、それを試みた。値が与えられていれば動作していますが、値が与えられていなければ動作していません。空の場合はWHERE句の条件を無視する

どうすればよいですか?

3つのフィルタがあります。 の日付がの場合は、指定した日付でデータが表示されます。再びソースが選択されている場合は、指定された日付と指定されたソースによってデータが表示されます。これのように、うまくいくはずです。

$date_from = NULL; //the value will be given if the user selects the date range 
$date_to = NULL; 

$src_id = NULL; // this value will be given if the user wants data from specific source 
$gndr_id = NULL; // if user want data by gender 

$leadSql = "SELECT 
      lead.id as lead_id 
      , lead.name as lead_name 
      , lead.phone as lead_phone 
      , lead.email as lead_email 
      , gender.name as lead_gender 
      , treatment.name as treatment_name 
      , lead.date as lead_date 
      , source.name as source_name 
      , status.name as status_name 
      , lead.remark as lead_remark 
     FROM lead 
     join treatment on treatment.id = lead.treatment_id 
     join gender on gender.id = lead.gender_id 
     join source on source.id = lead.source_id 
     join status on status.id = lead.status_id 

     where (lead.date BETWEEN $date_from and $date_to) and 
     (lead.source_id = $src_id) and (lead.gender_id = $gndr_id) 

     ORDER BY lead_date DESC"; 

どうかしてください。

+0

クエリ内に3項演算子を使用することもできますが、これは1つの方法です。 –

答えて

1

私の知る限り、値が存在するかどうかを判断するにはWHERE句を無視しないとWHERE句が適用されます。

if($date_from != NULL && $date_to != NULL .....){ 
    $where_clause = "where (lead.date BETWEEN $date_from and $date_to) and 
      (lead.source_id = $src_id) and (lead.gender_id = $gndr_id)"; 
} else{ 
    $where_clause =""; 
} 

$leadSql = "SELECT 
       lead.id as lead_id 
       , lead.name as lead_name 
       , lead.phone as lead_phone 
       , lead.email as lead_email 
       , gender.name as lead_gender 
       , treatment.name as treatment_name 
       , lead.date as lead_date 
       , source.name as source_name 
       , status.name as status_name 
       , lead.remark as lead_remark 
      FROM lead 
      join treatment on treatment.id = lead.treatment_id 
      join gender on gender.id = lead.gender_id 
      join source on source.id = lead.source_id 
      join status on status.id = lead.status_id 

      ".$where_clause." 

      ORDER BY lead_date DESC"; 

お客様のニーズに合わせて調整できます。これは最も簡単な解決法です。 各変数に条件文を記述し、最後にそれらを連結することができます。

$where = []; 
$where_clause = ''; 

if ($date_from && $date_to) { 
    $where[] = "(lead.date BETWEEN $date_from and $date_to)"; 
} 

if ($src_id) { 
    $where[] = "(lead.source_id = $src_id)"; 
} 

if ($gndr_id) { 
    $where[] = "(lead.gender_id = $gndr_id)"; 
} 

if (count($where)) { 
    $where_clause = 'WHERE ' . implode(' AND ', $where); 
} 
+0

ありがとう、ダニエル、あなたは素晴らしいです!出来た。 – Jayprakash

関連する問題