【问题标题】:Select with multiple conditions多条件选择
【发布时间】:2015-06-11 07:09:22
【问题描述】:

用户需要在表单中勾选接收通讯的选项,例如:

<input type="checkbox" name="male"  value="1" />
<input type="checkbox" name="female"  value="1" />
<input type="checkbox" name="person" value="1" />
<input type="checkbox" name="company" value="1" /> 

但是我有问题如何使用选中的选项为 db 创建查询

到目前为止我有这个代码,但它并不好,因为时事通讯需要一直为 1,然后我有 OR,因为当我输入 AND 时,我没有得到我需要的结果:

if($options['male']) {
            $sqlAddMale = " OR gender = 2 ";
        }
        if($options['female']) {
            $sqlAddFemale = " OR gender = 1 ";
        }
        if($options['person']) {
            $sqlAddPerson = " OR VAT = '' ";
        }
        if($options['company']) {
            $sqlAddCompany = " OR VAT <> '' ";
        }

        $query = "
            SELECT email FROM users WHERE newsletter=1
            ".$sqlAddMale."
            ".$sqlAddFemale."
            ".$sqlAddPerson."
            ".$sqlAddCompany."          
            ";

【问题讨论】:

  • 首先在 SQL 中从您的 SQL 查询开始,然后让它工作,所有的 OR 使结果非常开放,发布您的 SQL,例如应该适用于一个示例(你会期望的)跨度>
  • 如果您没有得到想要的结果 - 数据有问题吗?一目了然,您应该使用AND
  • @Goikiu 当我检查例如女性和增值税时,我没有得到我想要的结果,因为查询看起来像这样 SELECT acEmail AS email FROM _site_vuser WHERE anNewsletter=1 OR anGender = 1 OR acVAT = "",它应该看起来像这样 SELECT acEmail AS email FROM _site_vuser WHERE anNewsletter=1 AND anGender = 1 OR acVAT = ''
  • @gandrap 我在这里为你添加了答案stackoverflow.com/a/30774504/4323504

标签: php sql sql-server


【解决方案1】:

我认为你需要这样的东西:

$placeOr = false;
if($options['male']) {
    $placeOr = true;
    $sqlAddMale = " (newsletter=1 AND gender = 2) ";
}
if($options['female']) {
    $sqlAddFemale = (($placeOr)?" Or ":"");
    $sqlAddFemale .= " (newsletter=1 AND gender = 1) ";
    $placeOr = true;
}
if($options['person']) {
    $sqlAddPerson = (($placeOr)?" Or ":"");
    $sqlAddPerson .= " (newsletter=1 AND VAT = '') ";
    $placeOr = true;
}
if($options['company']) {
    $sqlAddCompany = (($placeOr)?" Or ":"");
    $sqlAddCompany .= " (newsletter=1 AND VAT <> '') ";
    $placeOr = true;
}

$query = "
    SELECT email FROM users WHERE 
    ".$sqlAddMale."
    ".$sqlAddFemale."
    ".$sqlAddPerson."
    ".$sqlAddCompany."          
    ";

【讨论】:

  • 我在 sql 中有错误,当我检查女性和人 SELECT acEmail AS email FROM _site_vuser WHERE (newsletter=1 AND anGender = 1) (newsletter=1 AND acVAT = '') 时,这是在您的代码后查询
【解决方案2】:

这是解决问题的方法,使用一个变量来构建 where 子句,添加第一个条件时使用 AND 运算符,否则使用 OR

$sqlString = '';
if($options['male']) {
         $sqlString = " AND gender = 2 ";
    }
    if($options['female']) {
        if(!$sqlString) $sqlString = " AND gender = 1 ";
        else
            $sqlString .= " OR gender = 1 ";
    }
    if($options['person']) {
        if(!$sqlString) $sqlString = " AND VAT = '' ";
        else
            $sqlString .= " OR VAT = '' ";
    }
    if($options['company']) {
        if(!$sqlString) $sqlString = " AND VAT <> '' ";
        else 
           $sqlString .= " OR VAT <> '' ";
    }

    $query = "SELECT email FROM users WHERE newsletter=1'".$sqlString."'";

【讨论】:

  • @gandrap 我在第一个条件上犯了一个错误,所以现在我编辑了它,而不是$sqlString = " OR gender = 2 "; 我现在有$sqlString = " AND gender = 2 ";
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多