我有3张桌子:
Customers = id, etc
Bikes = id, customer_id, etc
Services = id, bike_id etc
我想要这样的结果:
customer_name | customer_email | last_service | total_service
我已经在MySQL前端尝试过它,并且可以正常工作:
select c.name, c.email, max(s.created_at) as last_service, count(s.id) as total_service
from customers c
inner join bikes b
on b.id = c.id
inner join services s
on s.bike_id = b.id
group by c.id
但是在Laravel中,它给了我一个错误:
$customers = DB::table('customers')
->join('bikes', 'customers.id', '=', 'bikes.customer_id')
->join('services', 'bikes.id', '=', 'services.bike_id')
->select('customers.*', DB::raw('max(service.created_at) as last_service'), DB::raw('count(service.id) as total_service'))
->orderBy('total_service', 'desc')
->groupBy('customers.id')
->get();
我遇到这样的错误:
SQLSTATE[42000]: Syntax error or access violation: 1055 'db_safahonda.customers.customer_name' isn't in GROUP BY
在另一个相同的问题上,有些人回答要在MySQL strict to false
上更改config/database.php
。
它适用于我的视图和dd,但是我所有的last_service
仍显示相同的日期。
答案 0 :(得分:0)
Laravel似乎可以使用groupBy方法的一些简写形式,但是MySQL和其他数据库需要知道如何处理其他字段。由于您选择的是*,因此可以带来很多好处。
尝试将max(customer_name)
添加到select语句中,您可能需要为其他字段重复,以赋予mysql一个聚合字段的功能(字符串的最大值很愚蠢,但是它解决了这个问题,因为首先和最后一个不存在)。
答案 1 :(得分:0)
在聚合函数(max()
,count()
等)之外选择的任何值确实需要成为group by
子句的一部分。
将其他customers
表列添加到group by
子句将按照严格的标准(这是一个字符串列表,请参见下面的Laravel文档链接)来解决您的问题,就像选择其他所有列一样customers
表中具有聚合函数的列(如另一个答案中所述)。
http://www.mysqltutorial.org/mysql-group-by.aspx https://laravel.com/docs/5.8/queries#ordering-grouping-limit-and-offset