[mysql order by와 limit 활용]
데이터를 지정한 갯수만큼 가져올때 limit를 사용한다.
보통 order by를 사용하여 내림차순과 오름차순으로 정렬후에 가지고 오게 되는데
자주 쓰이지는 않지만 다음과 같은 경우가 있다.
1. 최근 게시글을 아래쪽으로 정렬(asc사용)
2. 최근 글에서 6개 데이터 가져오기
게시판에 맨 위에 글이 2017.01.02 가 되게 가지고 와야 한다. 만약 2017.01.08 게시글이 등록이 된다면
2017.01.03 글이 맨 위로 오게 가지고 오는 요구사항이 된다.
이론상 어려워 보이지는 않지만
sql문을 작성하다보면 뭔가 알게모르게 원하는 데이터를 가져오지 못하는 나를 발견했다. ㅋㅋ
방법은 총 2가지 이다.
1번 : 정렬을 마친 데이터에 php 함수(array_reverse) 사용
2번 :서브쿼리로 가져오기
1번의 경우 가져올 데이터 양이 작고, 데이터 검색이나 페이징을 사용하지 않는 경우에 사용하는게 좋다.
왜냐면 이미 1번 정렬이 끝난 데이터를 다시한번 역순으로 반복함으로 사용되는 트래픽이 있기 때문에 느려진다.
2번의 경우 개발할때 번거롭고... 번거롭고.. 번거롭... 지만 그래도 만들어놓고 나면 사용성이 많아 지니까 편하긴 하다.
데이터가 많을 경우 1번을 사용한다면 검색하는데 어쩌면 30분 40분이 걸릴수도있다 (그전에 서버 과부하가 걸릴 위험도 높다)
아무튼 1번의 경우 방법은 간단하다.
limit을 사용할때 시작점을 걸어주지는 말고 최근글 6개만 가져온다음 그걸 다시 역정렬 하는것이다.
$sql = SELECT * FROM board WHERE 1=1 ORDER BY b_idx desc limit 6
$res = $db->get_results($sql)
foreach(array_reverse($res) as $data)
{
.....
}
2번의 경우 쿼리문이 조금 복잡해진다.
select idx
from (
SELECT b_idx as idx FROM board WHERE 1 = 1 order by b_idx desc limit 6
) as reverse
order by idx asc
'php개발자(백엔드) > DB_mysql' 카테고리의 다른 글
서브쿼리 concat() 검색 (0) | 2018.03.05 |
---|---|
카페24 DB 연결 (0) | 2017.01.20 |
MYSQL 변수 선언 및 사용 (0) | 2016.09.19 |
MYSQL WHERE절 사용 (0) | 2016.09.05 |
기본 쿼리문 (select, update, delete) 구조 및 사용 (0) | 2016.08.19 |