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

时间:2014-05-30 14:59:25

标签: mysql cakephp

我正在尝试使用以下模型关联动态创建虚拟字段:

Retailer hasMany Invoice
Invoice有多个Invoiceitem

每张发票都有一个日期(invoice_date)和价格(price_paid)。

我正在检索零售商,受各种条件限制,对于每个零售商,我想要检索上个月花费的金额。我决定开始稍微不那么雄心勃勃了,并取消对过去一个月金额的限制......相反,我现在就一直这样做!

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

$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和虚拟字段的基础知识。

1 个答案:

答案 0 :(得分:1)

您需要确保定义虚拟字段的代码(即子查询)返回单个值。您的代码(如错误消息所示)可以返回超过1行。您还需要将子查询与要返回的记录相关联。在您的情况下,我认为这意味着使用零售商模型的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)