【问题标题】:CakePHP - How to use calculations from associated data in queryCakePHP - 如何在查询中使用关联数据的计算
【发布时间】:2014-04-29 14:22:23
【问题描述】:

我正在尝试找出做某事的最佳方法 - 基本上,我是在漫长/艰难地做之前寻求建议!

我有以下模型关联:

Seller hasMany Invoices
       Invoice hasOne Supplier
               Supplier belongsTo SupplierType

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

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

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

我主要不确定是否有办法计算出每月总数,然后一步过滤。还是我必须分几个步骤完成?我查看了虚拟字段,但我不认为它们能满足我的需要——它们似乎主要用于组合来自同一记录的字段——对吗?

【问题讨论】:

  • 您使用的是什么类型的数据库。这将需要一些子查询,但可以在单个查询中完成 - 我在下面给出一个临时答案,一旦我知道数据库,它可能会改变。
  • 我想他想知道如何通过 Cake 的 ORM 做到这一点
  • 您应该添加答案,而不是在问题中添加答案。按照设计使用 SO,届时您可能还会获得更多选票。
  • 我在此回应 @AD7six 的建议,Sharon。如果您自己发现了解决方案,请将其发布在答案框中。

标签: cakephp


【解决方案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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 哇,谢谢,这真的很有帮助!我会尝试一下!我还有一些其他条件需要为卖家填写,所以我需要弄清楚这些条件然后试一试。
    • 谢谢你 - 让这个工作,我想我已经能够适应第二种情况。现在我对 MySQL 的工作原理有了更多了解,这很棒。这里没有空间发布最终解决方案,但我会看看我是否可以将它添加到问题中,以防它帮助其他人。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多