user_id
, email
, phone
등을 포함하는 applications
테이블이 있습니다. 등록은 선택 사항이므로 사용자 계정을 만들거나 만들지 않을 수 있습니다. 따라서 user_id
은 Null입니다. 동일한 이메일 주소로 여러 번 적용 할 수도 있습니다.이 경우 의 applications
테이블은 여러 레코드에 걸쳐 복제됩니다.고유 한 열 값을 사용하여 모델 객체를 가져 오는 중
이제 목표는 중복을 제외한 모든 Application
모델 인스턴스를 가져 오는 것입니다. 예 : 잭이 [email protected]
으로 5 번 적용한 경우 applications
테이블은 email
열이 5 개인 레코드가 [email protected]
으로 설정됩니다. Application
을 가져올 때 [email protected]
과 함께 하나의 레코드 만 가져오고 싶습니다. 나머지 4 개는 무시해야합니다.
그래서 저는 여러 방법을 시도하지만, 하나는 모든 레코드를 가져 또는 전혀 실행하지 못했습니다 :
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')
때문에 비 aggreagated 열email
의get()
실패동시에,
groupBy('email')->get(['email'])
은 잘 작동하지만 문제는 다른 열 (created_at
이상)이 필요하다는 것입니다. ide ally - 전체Application
모델 인스턴스 테이블에서Application::whereIn('id', function($query) { $query->select('id')->groupBy('email'); })->get()
반환 모든 기록Column not found: 1054 Unknown column 'DISTINCT email' in 'field list'
에서
Application::select('*', 'DISTINCT email')->get()
결과 웅변 접근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)
SELECT email, id, created_at from (SELECT email, id, created_at FROM applications) apps group by email
사람은 알아 내기 위해 좀 도와 줄래 다음 쿼리
모두는 엄격 모드로 인해 활성화되고 실패 적절한 접근법? Eloquent를 사용하여 실제 모델로 작업하는 것을 좋아합니다. stdObj
또는 기타, Eloquent가 내 문제/제한 사항을 수용 할 수 있다면.
P. 사용중인 SQL 엔진은 입니다. 엄격한 모드가 활성화 된 MySQL입니다.