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