sql >> データベース >  >> RDS >> Mysql

mysql、1つの値=何かの場合、どこの条件でクエリを実行します

    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



    1. MySQLの現在の値に基づいてフィールドを更新するにはどうすればよいですか?

    2. 左結合がすべての行を返さない

    3. mysql LOAD DATA / mysqlimportのパフォーマンスを改善しますか?

    4. tag1とtag2の投稿を検索しますか? (結合テーブルを使用)存在する/持つ/サブクエリ...何を使用しますか?