带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql

Posted

技术标签:

【中文标题】带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql【英文标题】:Sum function with join is giving sum multiplies number of times of entries in laravel ORM with mysql 【发布时间】:2019-08-03 11:03:33 【问题描述】:

有2个表bills and payments,总销售额插入到订单表中,收入插入到付款表中。我想显示过去 7 天的总销售额和总现金收款,但我的查询给我的结果乘以 laravel 中同一日期的数据的次数。

表格账单

表格付款

我想获取bills.created_date=payments.created_date 的过去 7 天中每一天的总金额。我的查询效果很好,但它给了我总和乘以特定日期的条目。

我的查询(Laravel):

public function salesAndRevenue()
    $date = new Carbon\Carbon;

    $salesAndRevenue = 
        DB::table('bills')
        ->Join(
            'payments', 
            DB::raw('DATE(payments.created_at)'), 
            '=',
            DB::raw('DATE(bills.created_at)'))
        ->select(
            DB::raw('DATE(payments.created_at) as date'),
            DB::raw('sum(payments.amount) as total_revenue'),
            DB::raw('sum(bills.total_amount) as total_sales'))
        ->groupBy(DB::raw('DATE(payments.created_at)'))
        ->where(
            DB::raw('DATE(bills.created_at)'),
            '>',
            $date->subDays(7)->toDateTimeString())
        ->get()->toArray();    

        return $salesAndRevenue;
    

我的预期结果:

array:2 [▼
  0 => #254 ▼
    +"date": "2019-03-11"
    +"total_revenue": 5.0
    +"total_sales": 5.0
  
  1 => #255 ▼
    +"date": "2019-03-12"
    +"total_revenue": 1500.0
    +"total_sales": 1500.0
  
]

我的输出:

array:2 [▼
  0 => #254 ▼
    +"date": "2019-03-11"
    +"total_revenue": 5.0
    +"total_sales": 5.0
  
  1 => #255 ▼
    +"date": "2019-03-12"
    +"total_revenue": 4500.0
    +"total_sales": 4500.0
  
]

但是这段代码在不使用连接从单个表中获取数据的情况下完美运行。 喜欢:

$sales = 
    DB::table('bills')
    ->select(
        DB::raw('DATE(created_at) as date'), 
        DB::raw('sum(total_amount) as total_sales'))
    ->groupBy('date')
    ->where(
        DB::raw('DATE(created_at)'),
        '>',
        $date->subDays(7)->toDateTimeString())
    ->get()->toArray();

输出:

array:2 [▼
  0 => #259 ▼
    +"date": "2019-03-11"
    +"total_sales": 5.0
  
  1 => #260 ▼
    +"date": "2019-03-12"
    +"total_sales": 1500.0
  
]

【问题讨论】:

【参考方案1】:

问题出在你JOIN条件:

DB::table('bills')
->Join(
    'payments', 
    DB::raw('DATE(payments.created_at)'), 
    '=', 
    DB::raw('DATE(bills.created_at)')
)

您正在删除日期的时间部分,然后加入:因此您最终会为每个 bill 获得多个匹配的 payments

从您的示例数据来看,在我看来,payments.bill_id 列是为了加入:

DB::table('bills')
->Join(
    'payments', 
    DB::raw('payments.bill_id'), 
    '=', 
    DB::raw('bills.id')
)

【讨论】:

以上是关于带连接的求和函数是用 mysql 将 laravel ORM 中条目的总和乘以 mysql的主要内容,如果未能解决你的问题,请参考以下文章

使用多个连接和求和函数进行查询,给出错误的总数或总和

mysql 求和语句

mysql左连接同表求和错误结果

mysql聚合函数

mysql sum() 求和函数的用法

mysql的行求和、列求和是啥?