CodeIgniter 活动记录在子查询中的位置

Posted

技术标签:

【中文标题】CodeIgniter 活动记录在子查询中的位置【英文标题】:CodeIgniter Active Records where in subquery 【发布时间】:2018-02-16 20:47:35 【问题描述】:

如何使用 codeigniter 活动记录编写 where_in 语句子查询?

$query = $this->db->query("SELECT SUM(a.transaction_payment_amount) FROM 
         transaction_payment a WHERE a.transaction_link IN 
         (SELECT transaction_link FROM transaction WHERE transaction_type = '22'");
$result = $query->result();

现在如何将上述查询转化为 CI 活动记录?

我试过了:

$this->db->select("SUM(a.transaction_payment_amount)");
$this->db->from('transaction_payment a');
$this->db->where_in('a.transaction_link', "SELECT transaction_link from transaction WHERE transaction_type = '22'");
$query = $this->db->get();
$result = $query->result();

但它不起作用。

【问题讨论】:

如果可能的话,没有任何好处。它并不比使用查询方法时更便携。 @BrianGottier 好吧,我的查询只是一个例子,我的实际代码更长,更多的表和列,它变得有点难以阅读,有活动记录(如果它确实有相同的速度),将更整洁,更易于阅读。 如果您的查询更长更复杂,听起来您只需要使用格式/缩进使其更易于阅读。 @BrianGottier 好吧,当然,出于某种原因,我仍然更喜欢活动记录,只是想知道是否可以在活动记录中进行查询。 @Brian 查询构建器的最大优势在于 - 您可以轻松地将查询拆分为模型中的多个函数,并且仍然可以获得您想要的结果 - 使用单个查询除了事实之外这些好处是不存在的您可以制作独立于数据库的应用程序... 【参考方案1】:

试试这个

$this->db->where_in('a.transaction_link', "SELECT transaction_link from transaction WHERE transaction_type = '22'",false);

如果你使用 false 那么它将从 where_in 条件中删除单引号

【讨论】:

"false"!,该死的,正是我要找的,不知道有那个论点。谢谢! 您也可以在select,from 中使用false,就像在每个活动记录中一样,它将从活动记录中删除single quote。欢迎【参考方案2】:

Sharmas Answer 应该可以完成这项工作,但如果您希望完全支持查询生成器方法,您可以试试这个

$strSubQuery = $this->db
    ->select("transaction_link")
    ->from("transaction")
    ->where("transaction_type",22)
    ->get_compiled_select();

$query = $this->db
    ->select("SUM(a.transaction_payment_amount)", false)
    ->from('transaction_payment a')
    ->where_in('a.transaction_link', $strSubQuery, false)
    ->get();

【讨论】:

【参考方案3】:

您可以按照以下解决方案更改您的代码。

更改您的查询

$this->db->select("SUM(a.transaction_payment_amount)");
$this->db->from('transaction_payment a');
$this->db->where("a.transaction_link IN (SELECT transaction_link from transaction WHERE transaction_type = '22')", null, false);
//OR you can try other where condition if Sub query return null value than used this below query
$this->db->where("IF(SELECT transaction_link from transaction WHERE transaction_type = '22',a.transaction_link IN (SELECT transaction_link from transaction WHERE transaction_type = '22'), NULL)", null, false);
$query = $this->db->get();
$result = $query->result();

我希望这会对你有所帮助。谢谢!

【讨论】:

以上是关于CodeIgniter 活动记录在子查询中的位置的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查询转换为codeigniter活动记录

codeigniter 查询生成器和活动记录 sql 注入

Codeigniter 活动记录查询

codeigniter 活动记录,生成,但不执行查询

Codeigniter 活动记录查询的工作方式与自定义查询不同

codeigniter 活动记录获取查询和不带 LIMIT 子句的查询