Sql查询 - 如果声明

时间:2009-12-15 10:12:28

标签: php sql

我尝试为用户创建“高级”搜索字段。 (用户有5-8个字段来缩短搜索列表..)

我认为我必须根据发布的字段不为空来构建查询。

这是我原来的查询,但有了这个,我从表中得到了所有的行..

$query = "select * from MYTABLE where FIELD1 LIKE '%$sample1%' OR FIELD2 LIKE '%$sample2%' OR FIELD3 LIKE '%$sample3%' OR FIELD4 LIKE '%$sample4%' order by name"; 

所以我认为我必须在查询中使用IF语句,但我不知道如何,我一直有错误。还有一件事:如果用户填写“sample4”,那么他必须填写“sample1”。我怎么检查这个?

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

您也可以使用数组来执行此操作,它将以这种方式更有条理。对于每个where条件,将它们存储在一个数组项中,最后在生成SQL时将它们连接起来。

<?

$fields = array('field1', 'field2', 'field3');
// Changed this to 0, so it won't return all rows
// but also the default array element prevent the statement to fail when 
// no search is being specified at all
$wheres = array(0);
foreach ($fields as $fieldname) {
  // Get user input
  $search = $_GET[$fieldname];
  // add condition to wheres if not empty
  if (!empty($search)) {
    $wheres[] = $fieldname . ' LIKE "%' . mysql_real_escape_string($search)  . '%"';
  }
}

// Join the wheres conditions using OR, (or AND)
$query = 'select * from MYTABLE where' . join(' OR ', $wheres);

?>

答案 1 :(得分:1)

您应该考虑实施“全文搜索”引擎。

MySQL具有“FULLTEXT”搜索功能 - 您可以开始了解它here: 另见本文:Developing A Site Search Engine With PHP And MySQL

答案 2 :(得分:0)

也许最好创建一个只包含用户填写的过滤器约束的查询,而不是包括所有。

如果您希望遵循您的解决方案,则可以使用SQL构造

CASE WHEN

请参阅this了解MS SQL和this了解MySQL

答案 3 :(得分:0)

也许您会想要一个以php为中心的全文搜索解决方案 - 然后查看Zend_Search_Lucene这是Apache Lucene的PHP端口 Zend_Search_Lucene的演示文稿可在此处找到:

答案 4 :(得分:0)

您可以尝试使用“is not null”运算符,如下所示:

select * 
from mytable
where 
(field1 is not null and field1 like '%test%') or 
(field2 is not null and field2 like '%test%') or 
(field3 is not null and field3 like '%test%') or
(field4 is not null and field4 like '%test%')
order by name

另见Handling MySQL NULL Values