1

ユーザーからの入力を取得した後、DAO クラスで構築しているこのクエリがあります。ユーザーが提供する約 10 のオプションを備えた基本的な検索機能です。以下のクエリを作成しました。

  1. ユーザーは日付の範囲を指定します。
  2. ユーザーは家賃の範囲を提供します。
  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 はおそらく数値です。2 つのテキスト フィールドの間にあるかどうかを尋ねています。その条件は決して真ではありません。

于 2012-12-06T02:51:01.357 に答える
0

プログラムに入力パラメーターの検証を追加します。NULL の場合は sql に入れないでください。

于 2012-12-06T02:24:46.947 に答える