【问题标题】:SQLSTATE[42000]: Syntax error or access violation: 1055 Laravel 5.8 MySQLSQLSTATE [42000]:语法错误或访问冲突:1055 Laravel 5.8 MySQL
【发布时间】:2020-06-16 14:33:50
【问题描述】:

我有 MySQL 查询(这是工作),例如:

SELECT 
    project_bills.*, 
    project_deliveryorder.totalcost,
    project_deliveryorder.deliveryorder_number,
    project_deliveryorder.deliveryorder_subject,
    SUM(project_bills_payment.payment_amount) AS TOTAL
FROM 
    project_bills 
JOIN
    project_deliveryorder ON project_bills.id_deliveryorder = project_deliveryorder.id
JOIN
    project_bills_payment ON project_bills.id = project_bills_payment.id_bill
GROUP BY
    project_bills.id
ORDER BY
    project_bills.bill_date, project_bills.id DESC;

我尝试翻译成 Laravel 格式,例如:

DB::table('project_bills')
    ->join('project_deliveryorder', 'project_bills.id_deliveryorder', '=', 'project_deliveryorder.id')
    ->join('project_bills_payment', 'project_bills.id', '=', 'project_bills_payment.id_bill')
    ->select('project_bills.*', 'project_deliveryorder.totalcost', 'project_deliveryorder.deliveryorder_number', 'project_deliveryorder.deliveryorder_subject', DB::raw('SUM(project_bills_payment.payment_amount) AS TOTAL'))
    ->groupBy('project_bills.id')
    ->orderBy('project_bills.bill_date', 'DESC')
    ->orderBy('project_bills.id', 'DESC')
    ->get();

然后我收到一些错误,例如:

SQLSTATE[42000]:语法错误或访问冲突:1055 'db_tcm.project_bills.id_deliveryorder' 不在 GROUP BY 中

我也读过 Stack Overflow 中的Group by not working - Laravel,那么解决这个问题的最佳方法是什么?

  • 更改数据库配置 ('strict' => true)?
  • 在 MySQL 上禁用“ONLY_FULL_GROUP_BY”?
  • 还是重新构建 Laravel 查询构建器?

【问题讨论】:

    标签: php mysql database laravel laravel-5


    【解决方案1】:

    当您的查询中有GROUP BY 时,您只能选择GROUP BY 中的列,或者是SUM()MIN()MAX() 等聚合函数。

    如果我正确理解您的数据,您可以在单独的查询中提取 SUM(),然后将 JOIN 提取到主查询中。

    DB::table('project_bills as pb')
        ->join('project_deliveryorder as pdo', 'pb.id_deliveryorder', '=', 'pdo.id')
        ->join(DB::raw('(SELECT id_bill, SUM(payment_amount) AS TOTAL
                          FROM project_bills_payment
                          GROUP BY id_bill) AS pbp'), 'pb.id', '=', 'pbp.id_bill')
        ->select('pb.*', 
                 'pdo.totalcost', 
                 'pdo.deliveryorder_number', 
                 'pdo.deliveryorder_subject', 
                 'pbp.TOTAL')
        ->orderBy('pb.bill_date', 'DESC')
        ->orderBy('pb.id', 'DESC')
        ->get();
    

    禁用严格模式或禁用ONLY_FULL_GROUP_BY 在我看来不是一个好主意,如果您可以通过重新处理查询来避免它,那通常会好得多。

    【讨论】:

    • 这是工作!非常感谢你,->join(DB::raw('(SELECT id_bill, SUM(payment_amount) AS TOTAL FROM project_bills_payment GROUP BY id_bill) AS pbp'), 'pb.id', '=', 'pbp.id_bill')
    • 啊,好像我漏掉了一个括号,哎呀.. :-)
    猜你喜欢
    • 2017-07-31
    • 2019-06-06
    • 2018-05-31
    • 2017-02-01
    • 2017-04-01
    • 2023-04-01
    • 1970-01-01
    • 2017-10-29
    • 2023-03-11
    相关资源
    最近更新 更多