【问题标题】:select error if there is no data in and clause如果and子句中没有数据,则选择错误
【发布时间】:2018-07-22 12:05:03
【问题描述】:

我有一个查询,它获取表单详细信息,如果已分配给某个用户,则丢弃表单。

$formIds = DB::table('tbl_staff_user_details')
          ->select(DB::raw('GROUP_CONCAT(forms_assigned) as form_ids'))
          ->first();
$formIds = array_unique(explode(",", $formIds->form_ids));
if (Input::has('form_id'))
{
     $sql = 'SELECT * from tbl_forms where id IN('.Input::get('form_id').')';
}
else
{
     $lm_ids = Input::get('law_id');            
     $sql =  'SELECT *
              FROM tbl_forms
              WHERE lm_id IN('.$lm_ids.') AND id 
              NOT IN('.join(",",$formIds).')';
}
$data = DB::select($sql);

当我做dd($formIds) 时,我得到的是" "

错误如下:

语法错误或访问冲突:1064 在第 3 行 (SQL: SELECT * FROM tbl_forms WHERE lm_id IN(1,2,3,4,5) AND id NOT IN())

如果$formIds 为空,如何触发$sql

【问题讨论】:

  • 如果 $formIds 不为空,只需放置一个 if 块,然后只触发查询。
  • @AnkitBajpai 如果 $formIds 为空,我希望 $sql 被解雇。

标签: mysql sql database laravel


【解决方案1】:

如果 $formIds 为空,如何触发 $sql。

编辑 2:

如果$formIdsnull,我不希望AND id NOT IN('.join(",",$formIds).') 子句成为$sql 的一部分

...
if($formsIds) $formIds = array_unique(explode(",", $formIds->form_ids)); // Dont forget this line

if (Input::has('form_id'))
{
     $sql = 'SELECT * from tbl_forms where id IN('.Input::get('form_id').')';
}
else
{
   $lm_ids = Input::get('law_id');
   if(is_null($formIds) || empty($formIds)) {        
     $sql = 'SELECT * FROM tbl_forms WHERE lm_id IN('.$lm_ids.')';
   } else {
     $sql = 'SELECT * FROM tbl_forms WHERE lm_id IN('.$lm_ids.') AND id NOT IN('.join(",",$formIds).')';
   }

}
$data = DB::select($sql);

if($data) {
   //Handle data here
} else {
   //$data is empty
}

【讨论】:

  • 我想要 $sql = 'SELECT * FROM tbl_forms WHERE lm_id IN('.$lm_ids.') AND id NOT IN('.join(",",$formIds).')';如果 $formIds 为空则被解雇。
  • 您知道$sql 在您的示例中永远不会为空吗?而是它将是一个空数组?无论如何,我会更新我的答案并包含更多代码
  • 它显示为未定义变量:$data = DB::select($sql);
  • 你不能指望别人代替你写代码,但我已经更新了我的答案,现在包含完整的代码
  • 先生,请指导我,因为我是新手,我不希望 AND id NOT IN('.join(",",$formIds).') 子句成为 $ 的一部分sql 如果 $formIds 为空。
【解决方案2】:

你可以filter空值:

$formIds = array_unique(explode(",", $formIds->form_ids));

$formIds = array_filter($formIds, function($item){
        return !empty($item);
});
if (Input::has('form_id'))
{
    $sql = 'SELECT * from tbl_forms where id IN('.Input::get('form_id').')';
}
else
{
     $lm_ids = Input::get('law_id');      
     if(!empty($formIds)){      
        $sql =  'SELECT *
          FROM tbl_forms
          WHERE lm_id IN('.$lm_ids.') AND id 
          NOT IN('.join(",",$formIds).')';
     }else{
       $sql =  'SELECT *
          FROM tbl_forms
          WHERE lm_id IN('.$lm_ids.');
     }
}

【讨论】:

  • 如果 $formIds 具有空值,那么我不希望 AND id NOT IN('.join(",",$formIds).') 子句成为 $sql 的一部分。跨度>
【解决方案3】:

在您构建查询的行中,仅在有意义的情况下添加 NOT IN 子句。

$sql = "SELECT *
          FROM tbl_forms
          WHERE lm_id IN('.$lm_ids.')";

if ($formIds != null) {
     $sql .= ' AND id NOT IN('.join(",",$formIds).')';
}

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2021-12-16
    • 2012-08-16
    相关资源
    最近更新 更多