2013-02-20 93 views
0

我想建立一个查询,这是其WHERE条款至今:条件检查在WHERE子句

WHERE (s.subject_name LIKE '%$keyword%' OR 
     c.city_name LIKE '%$keyword%' OR 
     o.option_name LIKE '%$option%' OR 
     d.district_id = $districtId OR 
     c.city_id = $cityId 
     ) 

我的实际情况是:

  • $keyword应该始终保持一个值。其他3不可以。
  • 如果只有$keyword有一个值,返回的记录应匹配subject_namecity_name中的 $keyword
  • 如果$optional有一个值,然后返回的记录应该匹配$keyword$option
  • 如果$districtId具有值,则结果应如果$cityId具有匹配3个变量值($keyword$option$districtId
  • 最后值与其他3一样,返回的结果应该匹配所有4个变量的值。

这些条件来自我的搜索页面。 $keyword是文本框中的值,需要关键字才能开始搜索。这就是为什么我说它总是有价值。其他3个值来自选择框,允许在需要时选择项目。

我试图使查询,其确定。但我真的很困惑WHERE条款。以上代码从我的WHERE条款到目前为止。但我无法得到我想要的结果。

+2

什么是期望的结果,以及您需要什么? – 2013-02-20 01:42:41

+0

http://stackoverflow.com/questions/5540416/how-to-ignore-a-condition-in-where-clause?rq=1 – 2013-02-20 01:43:45

+0

输出来,如果至少有五个必须匹配 – ugnuku 2013-02-20 01:44:57

回答

1

如果你想在纯SQL来实现这一点,这是你需要(或者至少应该是足够接近)什么:

WHERE (
    (s.subject_name LIKE '%$keyword%' OR c.city_name LIKE '%$keyword%') 
    AND ('$option' = '' OR (
     o.option_name LIKE '%$option%' AND (
      '$districtId' = '' OR (
       d.district_id = $districtId AND (
        '$cityId' = '' OR c.city_id = $cityId 
       ) 
      ) 
     ) 
    ) 
) 

然而,这是迄今为止次优的。相反,您应该检查PHP中用户输入的内容,并根据此输入运行不同的查询。您也可以动态构建查询:

$query = "SELECT ..."; 

$query .= 
    " WHERE ((s.subject_name LIKE '%$keyword%' OR c.city_name LIKE %$keyword%')"; 
if (!empty($option)) { 
    $query .= " AND o.option_name LIKE '%$option%'"; 
    if (!empty($districtId)) { 
     $query .= " AND d.district_id = $districtId"; 
      if (!empty($cityId)) { 
       $query .= " AND c.city_id = $cityId"; 
      } 
    } 
} 
$query .= ')';