본문 바로가기
DB/MySql

[MySql] Order By, Limit의 결과 레코드가 중복 레코드인 경우

by se0nghyun2 2024. 12. 5.

문제 상황

MySql에서 Order by와 Limit 명령어로 로우 데이터를 하나씩 조회하려 한다(최대한 늦은 시간대부터 조회)

참고로 중복된 로우 데이터는 존재하지 않는다.(noti_no는 PK)

이 때, 이상하게 아래 두 limit 명령어를 통해 조회 시 아래와 같이 동일한 로우데이터가 조회된다....

1) limit 0,1

2) limit 1,1

 

limit 0,1(왼쪽) / limit 1,1(오른쪽)

 

 

원인

ORDER BY를 할 때, 기준이 되는 컬럼이 고유값을 가지고 있지 않으면, DB 또는 옵티마이저에 의해 최적의 방법에 따라 결과가 달라질 수 있습니다.

Order by 기준이 유니크한 값이 아닌 중복될 수 있는 start_dt, start_tm이다. 따라서, 위의 원인에 따라 항상 동일한 로우데이터들이 조회되는 것이 아니다. 

 

 

해결

start_dt,start_tm은 중복된 데이터가 존재할 수 있으니 유니크한 noti_no(pk)도 함께 정렬 기준으로 잡도록 한다.

 

 

다시 말하면, order by 정렬 기준에 지정된 컬럼에는 유니크한 컬럼이 존재해야 조회 순서를 보장받을 수 있게 된다.

 


참고

https://non-stop.tistory.com/512

https://www.postgresql.org/docs/current/queries-order.html

https://www.reddit.com/r/PostgreSQL/comments/ni2l9u/why_is_a_query_with_limit_returning_results_in_a/?rdt=48605

https://wooncloud.tistory.com/97