join 하기 이전에는 값이 중복없이 잘 출력되었으나
join 을 하니 한번 출력 되어야 할 값이 두번씩 출력이 되고 있었다
검색을 통해 알아보니 데이터베이스 관계설정이 없이 JOIN을 한 경우 중복값이 출력 될 수 있다고 하였다 (조금 더 찾아봐야 하는 내용)
쿼리문에 GROUP BY 문을 추가해주면 중복 없이 출력이 가능하다 하여 코드를 수정하였다
그런 중에 에러가 발생되어 기록하고자 한다
해결방법
1-1) group by 절에nonaggregated column
추가
1차코드
select mails.id, mails.writerEmail, mails.receiverEmail, mails.reserved_at, mails.title, mails.content, mails.isChecked, mails.isRead, mails.created_at, mails.updated_at, users.name from mails inner join users ON mails.receiverEmail = users.email Where writerEmail = "sunyeong2222@gamil.com" and date(reserved_at) <= date_format(now(), '%Y%m%d') group by mails.id;
Error 발생
err code ERROR 1055 (42000): Expression #11 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'slow_postbox.users.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
group by 절에 포함되지 않은 칼럼(집계되지 않은 칼럼(nonaggregated column))을 select 절에서 뽑아올 경우, 어느 칼럼을 표시해야 할 지 몰라 exception 이 발생하는 현상이다.
DB 스키마를 짤 때 관계가 없이 짜여졌기 때문에
mails.id 가 고유한 값이였으나 join 한 users.email의 경우 어떤 값을 표시해야 할지 db는 알 수 없다.
해결 방법은 여러가지가 있었으나 나는 group by 쿼리문을 수정하였다
수정코드
select A.id, A.writerEmail, A.receiverEmail, A.reserved_at, A.title, A.content, A.isChecked, A.isRead, A.created_at, A.updated_at, users.name from mails AS A inner join users ON A.receiverEmail = users.email Where writerEmail = "sunyeong2222@gamil.com" and date(reserved_at) <= date_format(now(), '%Y%m%d') GROUP BY A.id, users.name;
중복없이 출력 되는 자료를 확인할 수 있다!
수정코드2
group by
말고distinct
로 중복되는 값의 컬럼을 제거해도 동일하게 값이 출력 된다select distinct A.id, A.writerEmail, A.receiverEmail, A.reserved_at, A.title, A.content, A.isChecked, A.isRead, A.created_at, A.updated_at, users.name from mails AS A inner join users ON A.receiverEmail = users.email Where writerEmail = "sunyeong2222@gamil.com" and date(reserved_at) <= date_format(now(), '%Y%m%d') ;