mysql 如何通过连接不同的表来编写雄辩的查询

bvjveswy  于 2023-04-05  发布在  Mysql
关注(0)|答案(1)|浏览(120)

我有四张表。1)材料2)广告3)报价请求4)交易
我需要写一个查询,它将选择事务中涉及的每种材料的事务重量之和
我尝试的查询如下,

Transaction::->select(DB::raw("IF(transactions.is_sell = '1', advertisements.weight, offerrequests.weight) as weight"),DB::raw("IF(transactions.is_sell = '1', advertisements.material_id, offerrequests.material_id) as material_id"))
            ->leftJoin('advertisements', function ($join) {
                $join->on('advertisements.id', '=', 'transactions.post_id');
            })
            ->leftJoin('offerrequests', function ($join) {
                $join->on('offerrequests.id', '=', 'transactions.post_id');
            })
            ->leftJoin('materials', function ($join) {
                $join->on('materials.id', '=', 'material_id');
            })
           ->groupBy('material_id')->get();

交易记录表
| 身份证|物料标识|正在出售|帖子标识|
| --------------|--------------|--------------|--------------|
| 1|1|1|二十|
广告表
| 身份证|物料标识|重量|
| --------------|--------------|--------------|
| 1|1|10个|
OfferRequests表
| 身份证|物料标识|重量|
| --------------|--------------|--------------|
| 1|1|二十|
材料表
| 身份证|名称|
| --------------|--------------|
| 1|塑胶|
| 第二章|纸|
我的预期结果会是这样
| 重量|材料|
| --------------|--------------|
| 三十|塑料|
| 五十|纸|

dsf9zpds

dsf9zpds1#

您可以尝试查询如下:

$results = DB::table('transactions as t')
            ->leftJoin('advertisements as a', function ($join) {
                $join->on('a.id', '=', 't.post_id')
                     ->where('t.is_sell', '=', 1);
            })
            ->leftJoin('offerrequests as o', function ($join) {
                $join->on('o.id', '=', 't.post_id')
                     ->where('t.is_sell', '=', 0);
            })
            ->join('materials as m', function ($join) {
                $join->on('m.id', '=', DB::raw('COALESCE(a.material_id, o.material_id)'));
            })
            ->groupBy('m.id')
            ->selectRaw('SUM(CASE WHEN t.is_sell = 1 THEN a.weight ELSE o.weight END) AS weight')
            ->select('m.name AS material')
            ->get();

并打印重量和材料名称为:

foreach ($results as $result) {
    echo $result->weight . "\t" . $result->material . "\n";
}

相关问题