首页 > 解决方案 > 如何用join计算mysql?

问题描述

我正在使用 laravel 开发销售仪表板,需要计算每天的销售数量。我有两个表,产品和交易。在产品中,我拥有所有产品,在交易中,我拥有所有销售交易

通过这个查询,我可以按产品名称获得销售组的数量。

$dash = Transactions::select(DB::raw('`product_name` AS ProductName, COUNT(`cod_sale`) as `TotalSale`'))
        ->where('status_sale', '=', 'Finished')
        ->where('date_finished', '>=', $data)
        ->groupBy('product_name')
        ->get();

这个查询返回

[
  {
    "ProductName": "Product A",
    "TotalSale": 15
  },
  {
    "ProductName": "Product B",
    "TotalSale": 2
  },
  {
    "ProductName": "Product C",
    "TotalSale": 1
  },
  {
    "ProductName": "Product D",
    "TotalSale": 9
  }
]

如何退回未售出的产品以显示为零?请记住,表中的交易只是已售出的产品,而表中的产品是所有产品

我想以这种方式返回:

[
  {
    "ProductName": "Product A",
    "TotalSale": 15
  },
  {
    "ProductName": "Product B",
    "TotalSale": 2
  },
  {
    "ProductName": "Product C",
    "TotalSale": 1
  },
  {
    "ProductName": "Product D",
    "TotalSale": 9
  },
  {
    "ProductName": "Product E",
    "TotalSale": 0
  },
  {
    "ProductName": "Product F",
    "TotalSale": 0
  }

标签: phpmysqllaraveleloquent

解决方案


Use a LEFT JOIN:

Product::leftJoin('transactions', function($join) use($date) {
        $join->on('products.id', '=', 'transactions.product_id')
            ->where('status_sale', 'Finished')
            ->where('date_finished', '>=', $date);
    })
    ->groupBy('products.id')
    ->get([
        'products.name as ProductName',
        DB::raw('count(transactions.id) TotalSale')
    ]);

推荐阅读