当前位置: 首页 > 知识库问答 >
问题:

将不同的select sum查询与同一表中不同的where组合(Laravel方式)

房冥夜
2023-03-14

我有稍微不同的选择查询从同一个表中读取数据。

select user_id
     , SUM(credit_movement) as testing_fees
  from transactions
 where `type` in ('Testing', 'Testing Data') 
   and `user_id` in (118,124,352 ...)
group by `user_id`
select user_id, SUM(credit_movement) as production_fees 
from `transactions` 
where `type` in ('Production', 'Production Data') and `user_id` in (152,521,1341, ...)
group by `user_id`

typeuser_id正在更改。

在Laravel中,我最终为每种类型使用了1个查询,但是有10种类型,这意味着10 db连接——这不好。

$values['testing_fees'] = \DB::table("transactions")
     ->select(\DB::raw("user_id, SUM(credit_movement) as testing_fees"))
     ->whereIn('type', ["Testing", "Testing Data"])
     ->whereIn('user_id', $userIdsToBeUsed)
     ->whereDate('created_at', '>=', $fromDate->toDateString())
     ->whereDate('created_at', '<=', $toDate->toDateString())
     ->groupBy('user_id')
     ->get();

$values['production_fees'] = \DB::table("transactions")
     ->select(\DB::raw("user_id, SUM(credit_movement) as production_fees"))
     ->whereIn('type', ["Production", "Production Data"])
     ->whereIn('user_id', $userIdsToBeUsed)
     ->whereDate('created_at', '>=', $fromDate->toDateString()) // this is common
     ->whereDate('created_at', '<=', $toDate->toDateString())   // this is common
     ->groupBy('user_id')                                       // this is common
     ->get();

将这些查询合并到一个查询中,以便建立一个数据库连接以获取所有数据的好方法是什么?

(我正在寻找Laravel查询生成器实现这一点的方法)

共有2个答案

柳经纶
2023-03-14

如果您想避免关于哪个是哪个的混淆,您可以使用第三个键来告诉您正在处理的数据类型。查看Laravel文档,您的代码应该如下所示:

<?php

$values['testing_fees'] = \DB::table("transactions")
     ->select(\DB::raw("user_id, SUM(credit_movement) as testing_fees,'testing as type'"))
     ->whereIn('type', ["Testing", "Testing Data"])
     ->whereIn('user_id', $userIdsToBeUsed)
     ->whereDate('created_at', '>=', $fromDate->toDateString())
     ->whereDate('created_at', '<=', $toDate->toDateString())
     ->groupBy('user_id');


$values['production_fees'] = \DB::table("transactions")
     ->select(\DB::raw("user_id, SUM(credit_movement) as production_fees,'production' as type"))
     ->whereIn('type', ["Production", "Production Data"])
     ->whereIn('user_id', $userIdsToBeUsed)
     ->whereDate('created_at', '>=', $fromDate->toDateString()) // this is common
     ->whereDate('created_at', '<=', $toDate->toDateString())   // this is common
     ->groupBy('user_id');                                      // this is common


// and so on for $values

$query = array_shift($values);


foreach($values as $key => $sub_query){
    $query->union($sub_query);
}


$data = $query->get();

dd($data);

注:-

鲁博雅
2023-03-14

您可以使用UNION关键字:https://www.w3schools.com/sql/sql_ref_union.asp

因此,组合查询将如下所示:

select user_id
     , SUM(credit_movement) as testing_fees
  from transactions
 where `type` in ('Testing', 'Testing Data') 
   and `user_id` in (118,124,352 ...)
group by `user_id`
UNION
select user_id, SUM(credit_movement) as production_fees 
from `transactions` 
where `type` in ('Production', 'Production Data') and `user_id` in (152,521,1341, ...)
group by `user_id`

如果需要允许复制,请使用UNION ALL而不是UNION

 类似资料:
  • 问题内容: 我有3个查询已经达到我的SQL知识(如果重要的话,Microsoft SQL 2005)的顶峰-现在​​我需要将它们组合成一个查询,并将所有值都放在一行中。 我的实际查询如下,但是我认为如果在此处提供一个简单的版本会更容易: 查询一: 查询一个样本输出: 查询二: 查询两个样本输出: 查询三: 查询三个样本输出: 我曾尝试通过父SELECT语句(其中包括此Web链接的详细信息,并为每个

  • 我编写了一个查询,用于查找特定班级中某一性别的学生人数,但我无法找到一种方法来编写可以对两种性别执行相同操作的查询。我尝试编写两次查询(针对每个性别),然后使用UNION将它们组合起来,但也无法做到这一点。 查询# 1 结果: 查询#2 结果: 我希望输出如下,最好使用一个查询: 谢谢你。

  • 本文向大家介绍MySQL查询为表中的值设置不同的组合?,包括了MySQL查询为表中的值设置不同的组合?的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是对MySQL组合的查询- 这将产生以下输出-

  • 我只是在Spring数据中偶然发现了一些意想不到的行为。为了演示我设置了一些Spring Boot应用程序,其中添加了JPA、Web、H2https://start.spring.io/。 该应用程序包含两个表和一些数据: data.sql: 这个表结构只有一个模型,因为两个表的结构都是一样的。我为这个表创建了一个JpaRepository 示例DAO: 最后我添加了一个控制器(TestContr

  • 我使用嵌套的Select语句从表1中获得单行结果,我需要在同一行的末尾追加表3中的另一列(COLX)。我试过联合,但结果是两行。有什么建议吗? table2.colz和table3.colx是用来匹配条目的ID。这两个最终结果都符合要求。 编辑(进一步解释我的表结构) COLX是表3的ID,以匹配表2中的COLZ 表2 ID中的COL1与表1中的COL1匹配 结果我需要的是表1.col1,表1.c

  • 我正试图创建一个产品清单使用谷歌表。每种类型的产品都有许多属性(或变体),这些属性组合在一起可以创建单个产品。 例如,有 直径:1/4英寸、1/2英寸、3/4英寸等。 长度:1/2英寸、1英寸、1/2英寸等 材料:钢、不锈钢 等等 特定产品是这些变化的特定组合。例如: 1/4英寸X 1/2英寸钢制圆头方颈螺栓 我要做的是创建一系列只包含属性的列。因此,直径柱、长度柱、材料柱等。 然后,我想通过将这