php - 带有 join 的 Sum 函数给出总和乘以 laravel ORM 中条目的次数与 mysql

标签 php mysql sql laravel join

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

表格账单: enter image description here

付款: enter image description here

我想获取 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
  }
]

但是这段代码在不使用 join 从单个表中获取数据的情况下工作得很好。 喜欢:

$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
  }
]

最佳答案

问题出在你的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')
)

关于php - 带有 join 的 Sum 函数给出总和乘以 laravel ORM 中条目的次数与 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55130550/

相关文章:

php - 使用 php 清理 url 以实现 seo 友好

php - 我们应该始终跟踪查询和数据库错误吗?

php - sqlsrv_connect() 保持应用程序池中的连接处于事件状态

mysql - 我想在 mysql 中使用 Between 运算符,但工作不正常

php - 使用 codeigniter 时出现数据库错误 #1054

mysql - 如何查找具有相似字符串部分的重复行

mysql - 从列范围内的表中获取结果集?

c# - c#中是否有类似SQL IN语句的比较运算符

php - 在 Ubuntu 上从 PHP Access .mdb 文件

javascript - 使用 PHP 和 mysql 的 morrisJS 条形图人口