CakePHP - 如何在查询中使用关联数据的计算

问题描述 投票:1回答:2

我正在试图找出最好的办法 - 基本上我在寻找建议之前我做了很长/很难的方法!

我有以下模型关联:

Seller hasMany Invoices
       Invoice hasOne Supplier
               Supplier belongsTo SupplierType

每张发票都是特定金额,并且是从特定日期开始的。我希望能够检索在我们拥有数据的过去'整月'内花费一定金额的卖家。因此,我需要在最近的发票前1个月获取日期,找到自该日期以来该卖方的所有发票的总数,然后仅检索总额介于10,000和27000英镑之间的那些(或者其他用户设置的范围)。

其次,我希望能够做同样的事情,但包括SupplierType。因此,用户可能会说他们想要从设备供应商花费1000英镑到5000英镑之间的卖家,以及来自肉类供应商的1000英镑到7000英镑之间的卖家。

我的计划是初步搜索适当的供应商类型ID,然后我可以根据每个发票是否来自适当类型的供应商来过滤发票。

我主要不确定是否有办法计算每月总数,然后一步过滤它。或者我将不得不分几步完成它?我看了虚拟领域,但我不认为他们做了我需要的东西 - 它们似乎主要用于组合同一记录中的字段 - 这是正确的吗?

cakephp
2个回答
1
投票

(代表作者提问)。

我在这里发布最终解决方案,以防它帮助其他人:

SELECT seller_id FROM 
     (SELECT i.seller_id, SUM(price_paid) AS totalamount FROM invoices i 
     JOIN
     (SELECT seller_id, MAX(invoice_date) AS maxdate FROM invoices) sm
     ON i.seller_id = sm.seller_id
     WHERE i.invoice_date > (sm.maxdate - 30) GROUP BY seller_id) t
WHERE t.totalamount BETWEEN 0 AND 1000

1
投票

这可以在一个查询中完成,如下所示:

select * from (
select seller, sum(amount) as totalamount
from invoices i join
(select seller, max(invoicedate) as maxdate from invoices group by seller) sm
on i.seller=sm.seller
and i.invoicedate>(sm.maxdate-30)
group by seller
) t where t.totalamount between 1000 and 50000
© www.soinside.com 2019 - 2024. All rights reserved.