php mysql条件查询AND OR

时间:2013-11-04 10:44:57

标签: php mysql sql

我有一个这样的代码和用户以可检查的形式

选择的变量
SELECT
FROM
WHERE

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

GROUP BY

检查清单如下:

选择型号:

  • 型号1
  • 模型2
  • Model3
  • Model4

我想让这个查询动态化。我会为此做一个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?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分: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后跟一个或那个给出期望结果(产品匹配和第一个模型匹配)

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

有了这个说一个简单的解决方案就是使用和IN子句(因为它具有类似于(... OR ... OR ... OR ...)等的行为

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

可以从PHP获得in子句:

$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 .= ')';
}

(我没有测试过那段代码,所以可能会有拼写错误,但我觉得逻辑很合理。)

答案 1 :(得分:0)

$models = array($model1, $model2, $model3, $model4, $model5);
$models = implode(',', $models);

SELECT * FROM table WHERE product = 'Super Model' AND FIND_IN_SET(Model, $models);