【问题标题】:Laravel join tables and get max orders by usersLaravel 连接表并获得用户的最大订单
【发布时间】:2018-02-14 21:49:09
【问题描述】:

我有 2 个模型 OrdersUsers,我想获取订购最多的用户列表,其中 sum of totalamount

表结构

  //users
    id  name  phone_number  
    1   John  1111111111
    2   Mike  2222222222

  //orders
    id  user_id  total 
    1     1      500  
    2     1      450
    3     2      560
    4     1      850
    5     2      500

  //expected result 
    name  phone_number  orders  amount 
    John  1111111111      3      1800
    Mike  2222222222      2      1060

尝试使用以下查询

$privilaged_users = User::leftJoin('orders', 'orders.user_id', 'users.id')
                        ->select('name','phone_number')
                        ->max('orders.user_id as orders')
                        ->groupBy('orders.user_id')
                        ->get();

出现跟随错误

    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in
 your SQL syntax; check the manual that corresponds to your MySQL server version
 for the right syntax to use near 'as `orders`) as aggregate from `users` left 
join `orders` on `orders`.`user_id` ' at line 1 (SQL: select 
max(`orders`.`user_id` as `orders`) as aggregate from `users` left join `orders`
 on `orders`.`user_id` = `users`.`id` where `users`.`deleted_at` is null)

谢谢

【问题讨论】:

    标签: php laravel web laravel-eloquent laravel-query-builder


    【解决方案1】:

    你可以把这个查询写成,

    $privilaged_users = User::leftJoin('orders', 'orders.user_id',"=", 'users.id')
                        ->select('name','phone_number',DB::raw('max(orders.total) as orders_total'))
                        ->groupBy('orders.user_id')  
                        ->get();
    

    作为原始查询,因为默认情况下它将整个字符串视为列

    编辑

    您的问题是,您正在对聚合函数内部的字段进行分组。

    这里有一些解释my concern much better的链接。

    我对代码进行了更改。请检查一次。

    【讨论】:

    • 感谢您的回复,尝试您的解决方案得到相同的旧 SQLSTATE[42000]: Syntax error or access violation 错误
    • 是的,我犯了同样的错误Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ideal_chicken.users.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select name, phone_number, max(orders.user_id) as orders from users` left join orders on orders.user_id = users.id where @98 @.deleted_atorders.user_id) 的空组`
    • 尝试更改别名,如 orders_total
    • 尝试更改别名,如orders_total,并尝试从mysql文件夹的my.ini中的sql-mode中删除这个only_full_group_by模式
    • 我的 my.ini 文件中没有only_full_group_by ,我在生产服务器中运行代码,错误相同
    【解决方案2】:

    SELECT MAX(field AS something) 是无效语法。试试这个:

    $privilaged_users = User::leftJoin('orders', 'orders.user_id', 'users.id')
                            ->select('name','phone_number', DB::raw('max(orders.user_id) AS orders_total'), 'orders.user_id')
                            ->groupBy('orders.user_id')
                            ->get();
    

    并将 MAX 字段称为“聚合”

    【讨论】:

    • 感谢您的回复,尝试您的代码获取Call to a member function groupBy() on string
    • 请立即尝试。
    • 得到Syntax error or access violation: 1055 'eitansof_ideal_chicken.users.name' isn't in GROUP BY (SQL: select name, phone_number, max(orders.user_id) AS orders_total, orders.user_id`从users左加入ordersorders.@987653334@=@98654@98656 @ 其中users.deleted_at 是空组orders.user_id)`
    • 哦,你的sqlmodeONLY_FULL_GROUP_BY。您需要更改查询以将SELECTing 的任何列放在GROUP BY 子句中,或者在mysql 数组中设置strict => false config/database.php
    猜你喜欢
    • 2015-02-03
    • 2021-03-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多