CakePHP-使用复杂的MySQL查询创建虚拟字段

CakePHP-使用复杂的MySQL查询创建虚拟字段,mysql,cakephp,Mysql,Cakephp,我正在尝试动态创建一个虚拟字段,具有以下模型关联: 零售商有许多发票 发票有许多发票项目 每张发票都有日期(发票日期)和价格(已付价格) 我正在根据各种条件检索零售商,对于每个零售商,我希望检索过去一个月的花费。我已经决定开始稍微不那么雄心勃勃,并取消对上个月金额的限制。。。相反,我现在要一直从头再来 我对虚拟字段有以下定义: $this->Retailer->virtualFields['totalamount'] = 'SELECT SUM(price_pai

我正在尝试动态创建一个虚拟字段,具有以下模型关联:

零售商
有许多
发票

发票
有许多
发票项目

每张发票都有日期(发票日期)和价格(已付价格)

我正在根据各种条件检索零售商,对于每个零售商,我希望检索过去一个月的花费。我已经决定开始稍微不那么雄心勃勃,并取消对上个月金额的限制。。。相反,我现在要一直从头再来

我对虚拟字段有以下定义:

$this->Retailer->virtualFields['totalamount'] =
          'SELECT SUM(price_paid) AS totalamount FROM invoices i JOIN
           (SELECT retailer_id, MAX(invoice_date) AS maxdate FROM invoices 
           GROUP BY retailer_id) sm
           ON i.retailer_id = sm.retailer_id GROUP BY i.retailer_id';
但是,当检索结果时,会出现以下错误:

SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row

我只知道MySQL和虚拟字段的基本知识。

您需要确保定义虚拟字段的代码(即您的子查询)返回单个值。您的代码(如错误消息所示)可以返回多行。您还需要将子查询与返回的记录关联起来。在您的情况下,我相信这意味着使用零售商模型的id列

尝试将虚拟字段定义更改为:

(SELECT SUM(i.price_paid) 
 FROM invoice AS i
 WHERE YEAR(i.invoice_date) = YEAR(CURRENT_DATE() - INTERVAL 1 MONTH)
  AND MONTH(i.invoice_date) = MONTH(CURRENT_DATE() - INTERVAL 1 MONTH)
  AND i.retailer_id = Retailer.id)

谢谢艾萨克,但我已经读过这本书了——没有足够的细节让我理解它!非常感谢。这基本上是有效的,我能够适应它的其余需要做的事情!