【问题标题】:Query builder GROUP BY, HAVING, COUNT in LaravelLaravel 中的查询构建器 GROUP BY、HAVING、COUNT
【发布时间】:2020-09-23 02:22:52
【问题描述】:

如何在查询生成器中表达此代码。我正在使用 Laravel 6。

SELECT * FROM feedback GROUP BY noTicket having count(`status`) < 2 

我的代码:

$feedback = DB::table('feedback')
            ->groupBy('noTicket')
            ->having('count(status)', '<', 2)
            ->get();

错误代码:

SQLSTATE[42000]: Syntax error or access violation: 1055 'sifora.feedback.idFeedback' isn't in GROUP BY 
(SQL: select * from `feedback` group by `noTicket` having `count(status)` < 2) 

我的代码有什么问题? sql 代码与查询生成器之间似乎匹配。

谢谢

【问题讨论】:

  • 除非您按所有列分组,否则SELECT *GROUP BY 无效且毫无意义。我也怀疑有一个专栏count(status)
  • 您想通过查询实现什么目标?
  • @party-ring:这个 mysql 查询已经在 Navicat 上测试过并且可以完美运行。我想将所有相同的 noTicket 分组并选择 noTicket 哪个状态
  • @Ikra 请分享您的表结构、重现它的示例数据和预期结果。由于分组依据,您的查询不兼容。
  • @Ersoy:我的票务概念是,如果有人创建票并回复,它将存储在反馈表中。新工单用 status=1 标记,分配工单用 status=2 标记。我只想显示状态 = 1 且尚未分配的新票。因为 1 noTicket 可以有多个响应,并且状态将从 1(等待响应)、2(进行中)、3(已完成)、4(已关闭)示例 noTicket = 4 --> 我的窗口被打破 --> status = 1 noTicket = 4 --> 好的,我们将检查并修复 --> status = 2 所以,noTicket = 4 不能出现在新票中

标签: mysql laravel eloquent query-builder laravel-6


【解决方案1】:
$feedback  = DB::table('feedback')
    ->selectRaw('feedback.*, count(status) as count_status')
    ->groupBy('noTicket')
    ->havingRaw('count(status) > ?', [2])
    ->get();

还有严格模式,你可以在config/database.php中禁用它

'connections' => [
    'mysql' => [
        'strict' => false
    ]
]

但我不建议你这样做。在这里查看https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html,您可以获得更多关于分组方式的信息。

【讨论】:

    【解决方案2】:

    这里是完整的代码。非常感谢 Ersoy

            $getArray = DB::table('feedback')
                ->groupBy('noTicket')
                ->having(DB::raw('count(status)'), '<', 2)
                ->pluck('noTicket');
            $feedback = DB::table('feedback')
                ->whereIn('noTicket', $getArray)->get();
    

    【讨论】:

      【解决方案3】:

      这是查询的工作版本

      select noTicket
      from feedback
      group by noTicket
      having count(status) < 2;
      

      这是查询生成器;

      return DB::table('feedback')
          ->groupBy('noTicket')
          ->having(DB::raw('count(status)'), '<', 2)
          ->pluck('noTicket'); // you may replace this with get()/select()
      

      【讨论】:

      • 几乎正确。输出正确但未显示所有数据。输出在数组中。如果使用 pluck,则输出为 [2,3],即 noTicket = 2 和 noTicket = 3。如果使用 get,则输出为 [noTicket = 2, noTicket = 3]。之前谢谢你
      • 如答案中所述,您可以使用-&gt;get('noTicket')-&gt;select('noTicket')-&gt;get()。如果您不这样做,查询生成器将假定您想要select *
      • @Ikra - Hazem 也指出 - 我附加了替代方案作为回答的评论。这取决于您要如何显示。
      • @HazemMohamed:是的,我已经尝试了所有替代选项作为评论。如果我只使用-&gt;get-&gt;pluck,就会出错。另一方面,如果我使用-&gt;get('noTicket'),则结果在数组 ex: [2,3,5] 中。所以我需要选择数组中的位置。有什么简单的方法可以获取所有数据吗?之前谢谢你
      • @Ersoy:当我使用-&gt;get()-&gt;pluck()-&gt;select() 时出现错误。如果我使用-&gt;get('noTicket) 或-&gt;pluck('noTicket') 没有错误,但结果并未显示所有数据。如果使用-&gt;select('noTicket') 没有错误,但会按预期获取数据。所以我使用pluck('noTicket') 来获取值,然后需要选择数组中的哪个位置来检索所有数据。有什么简单的方法可以获取所有数据吗?谢谢你..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多