【问题标题】:not able to use query properly [closed]无法正确使用查询[关闭]
【发布时间】:2018-09-14 10:18:21
【问题描述】:

我正在尝试在 CodeIgniter 中运行以下查询,但它没有返回正确的输出 根据查询,条件之一是如果 $supplier_id 的值不匹配,则不应显示任何结果。但是,无论supplier_id 的值是多少,它都会显示所有结果。谁能帮我纠正这个查询

public function get_onboarded_detail()
    {
        $supplier_id = 40;
        $query = $this->db->select('*')

          ->from('job')
          ->join('job_workforce', 'job_workforce.job_id = job.id', 'Right')
          ->where('job_workforce.supplier_id',$supplier_id)
          ->where('job_workforce.status','onboarded')
          ->or_where('job_workforce.status','job_offer')
          ->or_where('job_workforce.status','offer_accepted_by_client')
          ->or_where('job_workforce.status','offer_accepted_by_supplier')
          ->get();
          $res =  $query->result();          
    }

【问题讨论】:

  • 尝试在$res = $query->result(); 之前回显查询echo $this->db->last_query();exit();
  • @Shreyas Achar 我得到这个 o/p = SELECT * FROM job RIGHT JOIN job_workforce ON job_workforce.job_id = job.id WHERE job_workforce .supplier_id = 40 AND job_workforce.status = 'onboarded' 或 job_workforce.status = 'job_offer' 或 job_workforce.status = 'offer_accepted_by_client' 或 @987654543333 = 'offer_accepted_by_supplier'
  • 如果你输入$supplier_id = '',你得到的输出是什么?
  • @ShreyasAchar 它给出了这个o/p SELECT * FROM job RIGHT JOIN job_workforce ON job_workforce.job_id = job.id WHERE job_workforce@. @ = '' AND job_workforce.status = 'onboarded' 或 job_workforce.status = 'job_offer' 或 job_workforce.status = 'offer_accepted_by_client' 或 job_workforce.@9876543 offer_accepted_by_supplier'
  • 如果是我,我会忘记所有 CI 的东西,而是专注于获取有效的原始查询。从那里我们可以讨论如何用 CI 的语法重写它。如果您想采用这种方法,请参阅:Why should I provide an MCVE for what seems to me to be a very simple SQL query?

标签: php mysql sql codeigniter


【解决方案1】:

您的 where 条件的实际问题是因为它包含“OR”条件,因此无论您的供应商 ID 系统都将返回真实结果。见下面的例子:-

您当前的 where 条件:-

WHERE job_workforce.supplier_id = 40 AND job_workforce.status = 'onboarded' OR job_workforce.status = 'job_offer' OR job_workforce.status = 'offer_accepted_by_client' OR job_workforce.status = 'offer_accepted_by_supplier' 

应该是:-

WHERE job_workforce.supplier_id = 40 AND (job_workforce.status = 'onboarded' OR job_workforce.status = 'job_offer' OR job_workforce.status = 'offer_accepted_by_client' OR job_workforce.status = 'offer_accepted_by_supplier') 

要使用 codeigniter 进行更正,请使用:

public function get_onboarded_detail()
{
    $supplier_id = 40;
    $query = $this->db->select('*')

      ->from('job')
      ->join('job_workforce', 'job_workforce.job_id = job.id', 'Right')
      ->where("job_workforce.supplier_id = $supplier_id AND (job_workforce.status = 'onboarded' OR job_workforce.status = 'job_offer' OR job_workforce.status = 'offer_accepted_by_client' OR job_workforce.status = 'offer_accepted_by_supplier')");

      ->get();
      $res =  $query->result();          
}

【讨论】:

  • 感谢您的努力,但我不相信,这被标记为正确答案,也得到了 2 个赞。因为它不使用 codeigniter 函数,而是编写自定义条件。凡事都有规定。
  • 注意,在 MySQL 中,这个可以简写为WHERE jw.supplier_id = 40 AND jw.status IN ('onboarded','job_offer','offer_accepted_by_client','offer_accepted_by_supplier')
【解决方案2】:

根据查询,条件之一是如果$supplier_id 的值不匹配,则不应显示任何结果。但是,无论supplier_id 的值是什么,它都会显示所有结果。

如果您在条件之间使用 OR,即使任何一个条件为真,它也会返回输出。如果要使用提供的所有条件过滤结果,请使用 AND

【讨论】:

    【解决方案3】:

    这就是你如何使用 where 条件的 codeigniter 分组。您可以相应地进行分组。

    public function get_onboarded_detail() {
    
        $supplier_id = 40;
        $query = $this->db->select('*')
                      ->from('job')
                      ->join('job_workforce', 'job_workforce.job_id = job.id', 'Right')
                      ->group_start()
                          ->where('job_workforce.supplier_id',$supplier_id)
                          ->where('job_workforce.status','onboarded')
                      ->group_end()
                      ->group_start()
                          ->or_where('job_workforce.status','job_offer')
                          ->or_where('job_workforce.status','offer_accepted_by_client')
                          ->or_where('job_workforce.status','offer_accepted_by_supplier')
                      ->group_end()
                      ->get();
             $res =  $query->result();          
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      相关资源
      最近更新 更多