본문 바로가기
php개발자(백엔드) /DB_mysql

mysql order by와 limit 활용

by 장김치 2017. 3. 10.

[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



일단 idx 한개만 가지고 와서 쿼리를 사용했지만 만약 컬럼 여러개를 가지고 와서 게시판을 만들경우,
가지고 오는 컬럼들을 한개한개, 한땀한땀 다 별칭을 사용하여 가지고 와줘야 한다는 것이다. (서브쿼리에서 * 를 사용하여 데이터를 가지고 올수는 없기에..)

자주 쓰이는 경우는 아니지만
알아서 손해보는건 아니니까 ^^




'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