2017-02-14 1 views
0

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

:

  1. groupBy('email') 때문에 비 aggreagated 열 emailget() 실패

    동시에, groupBy('email')->get(['email'])은 잘 작동하지만 문제는 다른 열 (created_at 이상)이 필요하다는 것입니다. ide ally - 전체 Application 모델 인스턴스 테이블에서

  2. Application::whereIn('id', function($query) { $query->select('id')->groupBy('email'); })->get() 반환 모든 기록

    Column not found: 1054 Unknown column 'DISTINCT email' in 'field list'

    에서

  3. 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입니다.

  • 답변

    0

    먼저 설득력있는 표현을 사용하려면 DB::raw('DISTINCT email')을 사용해야합니다.

    둘째, 나는 당신이이 방식으로 가야한다고 생각 :

    Application::select('id', 'email', 'more_fields')->groupBy('email')->get(); 
    

    당신은 당신의 select() 기능에 의한 열 그룹화가 있어야합니다.

    마지막 옵션은 :

    당신은 중복을 제거하기 위해 웅변 쿼리에 ->distinct() 기능을 사용할 수 있습니다.

    관련 문제