2013-10-03 24 views
0

我有两个表:MySQL的选择,其中,如果变量设置

  • 销售
  • sales_sizes

我想通过变量约束sales_sizes做一个查询$性别,$类别和$品牌。

如果设置了各个变量,如何设置where语句,如果未设置,请不要在查询中包含它们?

[括号内的伪代码]

SELECT size, country 
FROM `sales_sizes` WHERE sale_id IN (
    SELECT sale_id 
    FROM `sales` 
    WHERE [gender = $gender if $gender isset] 
    AND [category = $category if $category isset] 
    AND [brand = $brand if $brand isset] 

) 
+0

您是使用PDO还是以文本形式创建查询? – user4035

+0

在PHP中建立querry? – Naruto

回答

1

您可以收集你的变量为数组,然后处理它是这样的:

$gender = 'f'; 
$category = null; 
$brand = 'foo'; 

$rgCondition = ['gender'=>$gender, 'category'=>$category, 'brand'=>$brand]; 
$rgCondition = array_filter($rgCondition, function($x) 
{ 
    //strip null-ed values: 
    return isset($x); 
}); 
$rgWhere  = []; 

foreach($rgCondition as $sField=>$mValue) 
{ 
    $rgWhere[] = '`'.$sField.'` = "'.$mValue.'"'; 
} 
$sWhere = count($rgWhere)?' WHERE '.join(' && ', $rgWhere):''; 
//var_dump($sWhere); 

-I've跳过字符串逃跑,但不要忘记它。

+0

很好的解决方案。谢谢 – 2083

0

使用CASE语句 更新:以前的语法(如由少数人指出)不起作用。您可以按如下方式使用CASE:

SELECT size, country 
FROM `sales_sizes` WHERE sale_id IN (
    SELECT sale_id 
    FROM `sales` 
    WHERE [gender = $gender if $gender isset] 
    AND [category = $category if $category isset] 
    AND [brand = $brand if $brand isset] 

) 

WHERE gender 
    CASE WHEN gender ($gender) = isset THEN 
    $gender 
    ELSE 
    $gender='NULL' 
    END 
+0

这不起作用,请看case语句http://dev.mysql.com/doc/refman/5.0/en/case.html – user4035