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. 它只对一个变量有效 2. 如果用户选择 ie model2 和 model3 字符串将以 OR 语句开头,这不符合逻辑,因为它假设以 AND 开头。

我尝试过这样的事情:

$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. 它不是动态的,我想有类似的东西:“对于每个项目在数组中做某事”。

所以也许是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 部分周围添加 ( ) 将导致产品必须匹配以及所选模型之一。

话虽如此,一个简单的解决方案是使用 and 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 回答
0
$models = array($model1, $model2, $model3, $model4, $model5);
$models = implode(',', $models);

SELECT * FROM table WHERE product = 'Super Model' AND FIND_IN_SET(Model, $models);
于 2013-11-04T10:55:50.577 回答