mysql_ join 시 데이터 중복 행 발생 (ERROR 1055 (42000))

해달·2021년 11월 15일
0

TIL

목록 보기
59/80
post-thumbnail
post-custom-banner

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') ;


참고블로그

https://developyo.tistory.com/20

post-custom-banner

0개의 댓글