WHERE句の項目を論理的にグループ化するには、クエリで角かっこを使用します。
WHERE name = 'abc' AND (value = 12 OR 1=1)
2つの変数を受け入れ、それらの変数に基づいて検索するクエリを提供しようとしている場合は、ロジックがわずかにずれているだけです。
両方の変数が提供されている
2つの変数@incoming_name
があると仮定します および@incoming_value
:
SET @incoming_name = 'abc';
SET @incoming_value = 12;
SELECT * FROM table1
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)
これで
1 abc 12
1つの変数が提供されている
次に、ユーザーがこれらの値のいずれかにNULLを指定すると、検索でそれらをスキップします。
SET @incoming_name = 'abc';
SET @incoming_value = NULL;
SELECT * FROM table1
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)
これでも期待どおりの結果が得られます
1 abc 12
変数が提供されていない
ユーザーが検索を絞り込むためにどちらの変数も指定しない場合
SET @incoming_name = NULL;
SET @incoming_value = NULL;
SELECT * FROM table1
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)
表からすべての結果が得られます
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
スクリプトでの変数の使用
このメソッドを使用すると、SET
する必要はありません MySQLの変数名、これはデモンストレーションのみを目的としています。コード/スクリプトの値を他の言語でも入力できます。たとえば、PHPとPDOのプリペアドステートメントを使用する
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
次に、ユーザー変数を:incoming_name
にバインドできます。 および:incoming_value
期待どおりに検索されます。どちらかがnullの場合はスキップされ、そうでない場合は検索で必要になります。
警告: 私はこのコードをテストしていません、それはあなたにそれがどのように機能するかについての大まかな考えを与えるためだけです。 PHP PDOとここに記載されているプリペアドステートメント を使用します 。
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("SELECT * FROM table1
WHERE (:incoming_name1 = name OR :incoming_name2 IS NULL)
AND (:incoming_value1 = value OR :incoming_value2 IS NULL)");
$stmt->bindParam(':incoming_name1', $name);
$stmt->bindParam(':incoming_name2', $name);
$stmt->bindParam(':incoming_value1', $value);
$stmt->bindParam(':incoming_value2', $value);
if ($stmt->execute()) {
while ($row = $stmt->fetch()) {
var_dump($row);
}
}
クエリ内の各パラメータを個別の名前でバインドする必要があります。そのため、同じパラメータが2回必要な場合は、個別の名前(incoming_value1
)を付ける必要があります。 およびincoming_value2
)