1

在接受用户的输入后,我在我的 DAO 类中构建了这个查询。它具有基本的搜索功能,用户提供了大约 10 个选项。我写了以下查询,

  1. 用户给出日期范围。
  2. 用户提供租金范围。(这部分是当它为空时,我得到0条记录。我如何处理空值并且仍然让mysql返回数据。)
  3. 用户选择一个选项来查看具有图像的记录。
  4. 此查询的状态标志应为 1。
  5. 按标题搜索。即满足以上1到4个点,用户给出的关键字应该用like运算符搜索列标题。
  6. 最后结果按日期排序。

.

select SQL_CALC_FOUND_ROWS * 
from `database`.`table` 
WHERE (Date(ctimestamp) BETWEEN '2011-12-02' and '2012-12-06') and (crent BETWEEN '' and '') 
   and (cimg1 IS NOT NULL or cimg2 IS NOT NULL or cimg3 IS NOT NULL or cimg4 IS NOT NULL or cimg5 IS NOT NULL or cimg6 IS NOT NULL or cimg7 IS NOT NULL or cimg8 IS NOT NULL)
   and cflag = 1 and ctitle LIKE '%Testing%' 
order  by Date(ctimestamp) desc Limit 0, 100

所有参数都来自前端。现在对于这个查询,我有接近 13 条具有相同参数和条件的记录,但是当我运行它时,mysql 客户端它给了我 0 条记录。

这个查询给了我正确的数据,

select SQL_CALC_FOUND_ROWS * 
from `database`.`table`
WHERE (Date(ctimestamp) BETWEEN '2011-12-02' and '2012-12-06') 
   and (cimg1 IS NOT NULL or cimg2 IS NOT NULL or cimg3 IS NOT NULL or cimg4 IS NOT NULL or cimg5 IS NOT NULL or cimg6 IS NOT NULL or cimg7 IS NOT NULL or cimg8 IS NOT NULL)
   and cflag = 1 and ctitle LIKE '%Testing%' 
order  by Date(ctimestamp) desc Limit 0, 100

两者的区别在于这部分

and (crent BETWEEN '' and '') 

现在我的疑问是,当用户计划跳过这些字段时,我该如何处理这种情况。感谢一些见解。

4

2 回答 2

1

crent 可能是一个数值。你问它是否在两个文本字段之间。这种情况永远不会成立。

于 2012-12-06T02:51:01.357 回答
0

在程序中添加输入参数的验证。当它为NULL时不要把它放在sql中。

于 2012-12-06T02:24:46.947 回答