1

私はSELECT完璧に機能するステートメントを書きました。ただし、フォームからユーザーが送信した情報を取得し、それに基づいてデータベースから結果を返すように、いくつかの変更を加える必要があります。

これは基本的に商品検索になります。ユーザーが「赤」を検索すると、赤のすべてのアイテムが返されます。「赤」と「木」を検索すると、赤で木でできているアイテムのみが返されます。

これが私のHAVING条項です:

HAVING values LIKE "%Red%" AND values LIKE "%Wood%"

それぞれ異なる用語のセットを持つ一連の5つのドロップダウンメニューがある場合HAVING、ユーザーが使用するドロップダウンに基づいて動的に句を作成する必要がありますか?これはどのように行われますか?

4

3 に答える 3

1

ユーザーが選択できる「オプション」が正確に5つあることを考えると、静的SQLステートメントを選択します。

私がすることは、特定のオプションの「制限なし」を表す値として空の文字列を使用することです。したがって、私のステートメントは次のようになります。

HAVING `values` LIKE CONCAT('%',:b1,'%')
   AND `values` LIKE CONCAT('%',:b2,'%')
   AND `values` LIKE CONCAT('%',:b3,'%')
   AND `values` LIKE CONCAT('%',:b4,'%')
   AND `values` LIKE CONCAT('%',:b5,'%')

オプション1と2にのみ制限を適用し、オプション3には制限を適用しない場合。

$sth->bind_param(':b1','Red');
$sth->bind_param(':b2','Wood');
$sth->bind_param(':b3','');
$sth->bind_param(':b4','');
$sth->bind_param(':b5','');

オプション2にのみ制限を適用するには、たとえば

$sth->bind_param(':b1','');
$sth->bind_param(':b2','Wood');
$sth->bind_param(':b3','');
$sth->bind_param(':b4','');
$sth->bind_param(':b5','');

これにより、静的ステートメントを使用できます。変更する必要があるのは、バインドパラメーターに指定された値だけです。


オプションの「制限なし」を表すためにNULL値を使用することもできますが、NULL値が指定された場合に「制限なし」を実行するようにSQLステートメントを変更する必要があります。特にNULL値を確認してください。例:

HAVING ( `values` LIKE CONCAT('%',:b1,'%') OR :b1 IS NULL )
   AND ( `values` LIKE CONCAT('%',:b2,'%') OR :b2 IS NULL )
   AND ( `values` LIKE CONCAT('%',:b3,'%') OR :b3 IS NULL )

-または-LIKE述部で使用するために、NULLを空の文字列に変換します。

HAVING `values` LIKE CONCAT('%',IFNULL(:b1,''),'%')
   AND `values` LIKE CONCAT('%',IFNULL(:b2,''),'%')
   AND `values` LIKE CONCAT('%',IFNULL(:b3,''),'%')

同じ手法がWHERE句でも機能します。あなたの場合、WHERE句がより適切であるかどうかを検討することをお勧めします。(提供された情報からはわかりません。)

ただし、HAVING句は、ステートメントに含まれる行を制限しないことに注意してください。むしろ、HAVING句は、結果セットから返される行のみを制限します。HAVING句は、実行プランのほぼ最後に適用されます(その後に、ORDERBYとLIMITのみが続くと思います。

HAVING句は集計に適用できますが、WHERE句では適用できません。HAVING句は、WHERE句では実行できないSELECTリストの列を参照できます。

(また、VALUESは予約語であり、修飾されていない場合は注意してください(前にalias.、が付いている場合は、バッククォートで囲む必要がある場合があります)。

于 2012-08-07T20:09:03.370 に答える
0

いいえ、HAVING句を作成しないでください。

はい、提案したとおりにWHERE句を作成できます。

HAVINGは、グループに集計関数を含む条件を課すために使用されます。

于 2012-08-07T19:50:30.460 に答える
0

このアプローチは、より多くの条件が関係する場合には意味がありますが、5でも使用できます。メニュー値を一時テーブルに収集し、LIKE条件でクエリに内部結合します

SELECT .... FROM MyTable
INNER JOIN  MyTempTable
ON values LIKE '%' + MenuValue '%'
于 2012-08-07T19:58:48.810 に答える