【问题标题】:Using union in codeigniter query builder, and filter in a virtual mysql column在 codeigniter 查询生成器中使用联合,并在虚拟 mysql 列中过滤
【发布时间】:2018-03-05 05:21:34
【问题描述】:

在我的项目中,我使用带有服务器端处理的数据表插件。在我进行搜索或排序(排序)操作之前,它工作正常,因为它需要活动记录才能做到这一点。

我的场景是,我有一个帐户表、收入表和付款表,我想查看收入和付款表的所有数据,这就是我需要工会的原因。我的查询如下---

SELECT 'Income' as source, fld_type, fld_amount, ta.fld_account as account,  fld_date, tbl_revenue.fld_description as fld_traninfo, tbl_revenue.fld_created as created
        FROM tbl_revenue JOIN tbl_accounts as ta on tbl_revenue.fld_account_id = ta.fld_id
UNION
SELECT 'Expense' as source, fld_type, fld_amount, tae.fld_account, fld_date, tbl_payment.fld_description as fld_traninfo, tbl_payment.fld_created as created
        FROM tbl_payment JOIN tbl_accounts as tae on tbl_payment.fld_account_id = tae.fld_id

有没有办法在这个查询中使用查询生成器?

第二个问题,您可以看到我创建了一个名为“source”的虚拟列,我想使用 where 子句过滤此列并附加此查询,如下所示

WHERE source like "%a%" limit(10,0)

但是这返回我没有任何列名'source',我该如何过滤这个列?

感谢任何帮助。

【问题讨论】:

  • 你也可以使用$this->db->query($SQL)
  • 是的,我可以,但是在此之后我无法对此查询添加任何修改,就像在此之后我想订购它,$this->db->order_by('id',asc);它不会工作
  • SQL 结束只需添加ORDER BY id ASC
  • 它将根据提供的列名和方向 asc 或 desc 从外部订购

标签: mysql database codeigniter activerecord query-builder


【解决方案1】:

有一种方法可以做到这一点,但它有点hacky,因为如果你没有自己指定,codeigniter 的 querybuilder 会在查询中添加一个自动 SELECT 语句

为了得到你想要的,你必须将你的选择语句分成 2 个查询,并将 where 子句添加到这个查询中

类似的东西应该可以工作:

$strQuery1 = $this->db
    ->select('income as source, fld_type, fld_amount, ta.fld_account as account,  fld_date, tbl_revenue.fld_description as fld_traninfo, tbl_revenue.fld_created as created')
    ->from('tbl_revenue')
    ->join('tbl_accounts as ta', 'tbl_revenue.fld_account_id = ta.fld_id')
    ->get_compiled_select();

$strQuery2 = $this->db
    ->select('Expense as source, fld_type, fld_amount, ta.fld_account as account,  fld_date, tbl_revenue.fld_description as fld_traninfo, tbl_revenue.fld_created as created')
    ->from('tbl_payment')
    ->join('tbl_accounts as ta', 'tbl_revenue.fld_account_id = ta.fld_id')
    ->get_compiled_select();

$strWhere = substr($this->db->like('source', 'a', 'both')->get_compiled_select(), 8);

$query = $this->db->query($strQuery1.' UNION '.$strQuery2.$strWhere);

【讨论】:

  • strWhere中的8是什么意思?
  • 正如我在回答中所说,where 子句看起来像 SELECT * WHERE source LIKE '%a%' ESCAPE '!',因此它删除了 SELECT * 部分,因为查询构建器默认添加了 select 语句
  • 对您有帮助吗?
  • 如何订购这张桌子?并且,源不是 fld_list 中的列
  • source 不是一列是什么意思,此查询完全符合您在问题中描述的内容-按部分排序并不难-只需在之后添加 order_by like 函数 - $this->db->like('source', 'a', 'both')->order_by('your_field', 'ASC')->get_compiled_select() 之类的应该可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2022-11-08
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多