0

このようなコードと、ユーザーがチェック可能な形式で選択する変数があります

SELECT
FROM
WHERE

 product = 'Super Model'
 AND Model = 'Model1'
 OR Model = 'Model2'
 OR Model = 'Model3'
 OR Model = 'Model4'

GROUP BY

チェックリストは次のようになります。

モデルを選択:

  • モデル1
  • モデル2
  • モデル3
  • モデル4

このクエリを動的にしたい。これについては、switch case ステートメントを作成します。

switch ($model) {

    case "Model1":
        $models = " AND Model = 'Model1' ";
    break;

    case "Model2":
        $models = " OR Model = 'Model2' ";
    break;

    case "Model3":
        $models = " OR Model = 'Model3' ";
    break;

    case "Model4":
        $models = " OR Model = 'Model4' ";
    break;
}

ただし、問題があります: 1. 1 つの変数に対してのみ機能します 2. ユーザーがモデル 2 とモデル 3 などを選択すると、文字列は OR ステートメントで始まります。

私はこのようなもので試しました:

$models = " AND '.$model[0].' OR '.$model[1].' OR '.$model[2].'  OR '.$model[3].'  OR '.$model[4].' ";

次に $models を WHERE ステートメントに入れましたが、機能しません。そして、私は問題に気付きました: 1. ユーザーが 2 つのモデルのみを選択する場合、おそらくステートメントは次のようになります: " AND Model2 OR Model3 OR OR OR " 2. 動的ではありません。配列内で「sth」を実行します。

おそらくforeach?しかし、この AND を最初に処理し、他のモデル間で OR を処理するにはどうすればよいでしょうか?

どんな助けでも感謝します。

4

2 に答える 2

1

まず、論理演算子の組み合わせに注意する必要があります (mysql 演算子の優先順位については、このページを参照してください) http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html )、いくつかの例を見てみましょう:

mysql> select TRUE AND TRUE OR FALSE;
+------------------------+
| TRUE AND TRUE OR FALSE |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

ここでは、AND の後に or が続き、期待される結果が得られます (製品が一致し、最初のモデルが一致します)。

mysql> select FALSE AND FALSE OR TRUE;
+-------------------------+
| FALSE AND FALSE OR TRUE |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

ただし、この例では製品は一致しませんが、モデルが一致する場合でも結果が得られます。あなたの質問から、これはあなたが望むものではないようです。

mysql> select FALSE AND (FALSE OR TRUE);
+---------------------------+
| FALSE AND (FALSE OR TRUE) |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set (0.00 sec)

OR セクションの前後に ( ) を追加すると、選択したモデルの 1 つだけでなく、製品も一致する必要があります。

そうは言っても、簡単な解決策は IN 句を使用することです (これは (...OR...OR...OR...) などと同様の動作をするため)

WHERE  product = 'Super Model' AND Model IN ('Model1','Model2','Model3','Model4')

in 句は、PHP から次のように取得できます。

$models_string = "AND model IN ('".implode("','",$model)."')";

ただし、$model 配列に要素があることを確認する必要があります。

OR ステートメントを使用する場合は、次のようにします。

$models = '';
if(count($model) > 0 ){
   $models .= ' AND ( FALSE';
   foreach($model => $m){
      $models .= " OR model = '$m'";
   }
   $models .= ')';
}

(私はそのコードをテストしていないので、タイプミスがあるかもしれませんが、ロジックは正しいと思います)。

于 2013-11-04T10:58:58.060 に答える