【问题标题】:Laravel query LeftJoin show all categories even in right table have not that categoryLaravel 查询 LeftJoin 显示所有类别,即使在右表中没有该类别
【发布时间】:2020-01-21 01:37:07
【问题描述】:

我有两个表如下:

tb_category

id  |name      |
----------------
1   |Category A|
2   |Category B|
3   |Category C|
4   |Category D|
5   |Category E|

tb_sales
id |customer   |region       |product       |category
-------------------------------------------------------
1   James       Region A      Fruits         Category A
2   Billy       Region B      Vegetable      Category B
3   Benny       Region C      Computer       Category C
4   John        Region A      Table          Category D
5   Sarah       Region B      Fruits         Category A
6   James       Region A      Computer       Category C
7   Clara       Region B      Fruits         Category A
8   Benny       Region C      Vegetable      Category B
9   James       Region A      Vegetable      Category B
10  Billy       Region C      Fruits         Category A

我想创建查询并生成如下表所示的表 即使在 tb_sales 中的所有类别计数和显示都没有类别。

No  |name           |Region A   |Region B   |Region C
-----------------------------------------------------
1   Category A         1          1           1
2   Category B         1          1           1
3   Category C         1          0           1
4   Category D         1          0           0
5   Category E         0          0           0

in my controller I have write like this:

            $cat = DB::table('tb_sales')
                ->leftJoin('tb_category','tb_category.name', '=', 'tb_sales.category')
                ->select(DB::raw('category, region, count(category) as c_Cat'))
                ->groupBy('category', 'region')
                ->get();

                return view('category', ['Category'=> $cat]);

谁能帮我解决这个问题..? 提前致谢。

【问题讨论】:

  • 您当前查询的错误是什么?
  • 这不是错误但没有显示所有仅在 tb_sales 中显示类别的类别,我想显示和计算所有类别形式 tb_category 即使在 tb_sales 中没有类别(零值)。
  • 请检查我的答案

标签: laravel laravel-query-builder


【解决方案1】:

基本上,您使用从 tb_sales 到要检索所有类别及其区域的类别的左连接。试试下面的代码

 $cat = DB::table('tb_category')
                ->leftJoin('tb_sales','tb_category.name', '=', 'tb_sales.category')
                ->select(DB::raw('category, region, count(category) as c_Cat'))
                ->groupBy('category', 'region')
                ->get();

【讨论】:

  • 感谢您的回答,实际上您的代码结果与我上面的代码没有什么不同(来自 dd($cat) 显示重复类别的结果)我不想显示重复类别。你能告诉我如何像我上面的问题那样显示结果表吗?其中第 2 列中的类别名称和区域 A、B、C 到下一列。
【解决方案2】:

我已经解决了 laracast @Tray2 的答案。谢谢@Tray2。

使用这个查询:

SELECT c.name, 
         (SELECT count(s.*) from tb_sales s WHERE category = c.name AND s.region = 'Region A') AS region_a,
         (SELECT count(s.*) from tb_sales s WHERE category = c.name AND s.region = 'Region B') AS region_b,
             (SELECT count(s.*) from tb_sales s WHERE category = c.name AND s.region = 'Region C') AS region_c
FROM tb_category c
ORDER by c.name ASC

并将该查询传递给控制器​​:

$result = DB::select(<the query here>);

我希望这可以帮助有类似问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多