我有applications
表,其中包含user_id
,email
,phone
等。申请人可能会也可能不会创建用户帐户,因为注册是可选的;因此user_id
可以为空。他们也可能使用相同的电子邮件地址多次申请,在这种情况下,email
表中的applications
将在多个记录中重复。
现在,目标是获取除重复项之外的所有Application
模型实例。 EX:如果Jack使用jack@gmail.com
应用了五次,则applications
表将有5条记录,email
列设置为jack@gmail.com
。在获取Application
时,我只想获得jack@gmail.com
的一条记录,其他四条记录应该被忽略。
所以,我尝试了多种方法,但他们要么取出所有记录,要么根本不执行:
groupBy('email')
, get()
因{1}}而失败:
email
与此同时,Illuminate\Database\QueryException with message 'SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'applications.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
效果很好,但问题是我还需要其他列(至少groupBy('email')->get(['email'])
),理想情况下 - 完整的created_at
模型实例。
Application
返回表格中的所有记录
Application::whereIn('id', function($query) { $query->select('id')->groupBy('email'); })->get()
导致
Application::select('*', 'DISTINCT email')->get()
Eloquent方法Column not found: 1054 Unknown column 'DISTINCT email' in 'field list'
提供了正确的电子邮件列表,但我再次需要更多列,只需要电子邮件。一旦我开始选择更多列,我会继续将所有记录作为结果。
由于启用了严格模式,以下所有查询均失败:
Application::distinct()->get(['email'])
SELECT * FROM ( SELECT * FROM applications ORDER BY id DESC ) AS tmp GROUP BY email
SELECT * FROM applications WHERE id IN(SELECT id FROM applications GROUP BY email)
任何人都可以帮我找出正确的方法吗?我很乐意使用Eloquent并使用实际模型,而不是SELECT email, id, created_at from ( SELECT email, id, created_at FROM applications) apps group by email
或其他,如果Eloquent可以适应我的问题/限制。
P.S。我正在使用的SQL引擎是 MySQL ,启用了严格模式。
答案 0 :(得分:0)
首先,如果你想在你的口才中加入一个表达式,你必须使用DB::raw('DISTINCT email')
。
其次,我相信你应该采用这种方法:
Application::select('id', 'email', 'more_fields')->groupBy('email')->get();
您必须在select()
函数中将您按其分组的列。
最后一个选项:
您可以在您的eloquent查询中使用->distinct()
函数删除重复项。