我有一个这样的代码和用户以可检查的形式
选择的变量SELECT
FROM
WHERE
product = 'Super Model'
AND Model = 'Model1'
OR Model = 'Model2'
OR Model = 'Model3'
OR Model = 'Model4'
GROUP BY
检查清单如下:
选择型号:
我想让这个查询动态化。我会为此做一个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?
任何帮助表示感谢。
答案 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);