기본 콘텐츠로 건너뛰기

MySQL Natural sort (제목으로 정렬하기) 길이가 다른 데이터 정렬하기

나랑 똑같은 걸 원하는 사람이 있군....ㅋㅋㅋ 오늘 ..구글링

다음과 같은 데이터가 있다. ORDER BY title로 정렬하는 경우 원하는 결과가 출력되지 않고 있다.

mysql> SELECT * FROM chapter ORDER BY title;
+------------+
| title      |
+------------+
| Chapter 1  |
| Chapter 11 |
| Chapter 12 |
| Chapter 2  |
| Chapter 3  |
| Chapter 4  |
+------------+
6 rows in set (0.00 sec)
내가 원하는 결과는 다음과 같다. 어떻게 할 수 있는가?

+------------+
| title      |
+------------+
| Chapter 1  |
| Chapter 2  |
| Chapter 3  |
| Chapter 4  |
| Chapter 11 |
| Chapter 12 |
+------------+

ORDER BY title로는 질문자가 원하는 결과를 얻을 수 없다. 그렇다고 MySQL이 잘못된 결과를 출력한 것은 아니다. 질문자가 원하는 정렬을 NATURAL SORT라고 한다. 필자가 알기로는 MySQL에서 NATURAL SORT를 완벽하게 하는 방법은 없는 것으로 알고 있다.

질문자의 데이터에서는 다음의 SQL로 원하는 결과를 얻을 수는 있다.

SELECT title
FROM chapter
ORDER BY LENGTH(title), title;

+------------+
| title      |
+------------+
| Chapter 1  |
| Chapter 2  |
| Chapter 3  |
| Chapter 4  |
| Chapter 11 |
| Chapter 12 |
+------------+
6 rows in set (0.00 sec)
역순 정렬도 무리 없이 된다.

SELECT title
FROM chapter
ORDER BY LENGTH(title) DESC, title DESC;

+------------+
| title      |
+------------+
| Chapter 12 |
| Chapter 11 |
| Chapter 4  |
| Chapter 3  |
| Chapter 2  |
| Chapter 1  |
+------------+
6 rows in set (0.00 sec)
본 질문의 경우 모든 title이 동일한 “Chapter”라는 문자열로 시작했기 때문에 NATUAL SORT가 잘 작동하였다.

NATURAL SORT의 다른 방법으로는 title에서 “Chapter” 문자를 없애버린 뒤에 남아 있는 숫자 부분을 INT형으로 CAST한 뒤에 정렬하는 방법도 있으나 SQL이 복잡해진다는 단점이 있다. 그러나만약 숫자가 0 이상의 양수가 아닌 음수를 포함하는 경우는 방금 설명한 것과 같이 문자열을 모두 제거한 뒤 숫자 부분만 가지고 정렬하도록 해야 할 것이다.

댓글

이 블로그의 인기 게시물

톰캣 세션 타임 아웃 설정

web.xml 파일이 있습니다. 이 파일을 열어서 session이라고 검색해 보십시오. <session-config>   <session-timeout>360</session-timeout> </session-config> 위 단락을 찾을 수 있습니다. session-timeout 시간 360이 바로 자동로그아웃 세션 시간입니다.  단위는 분이고요. 30분으로 하고 싶으시면 30으로 바꿔서 저장해주시면 되는 것이죠~ Tomcat 내에서 Session Timeout 를 설정하는 우선 순위가 존재 한다. session.setMaxInactiveInterval() 프로그램내에서 time out 를 설정했을 경우 Web application 내의 WEB-INF/web.xml Tomcat 내의 conf/web.xml 실제로 Tomcat(conf/web.xml)내에 Default 로 설정되어 있는 것은 다음과 같다. < HttpSession 메서드 > getCreationTime() - 세션 생성 시간 getLastAccessedTime() - 마지막 요청 시간 setMaxInactiveInterval() - 최대허용시간 설정 (초) getMaxInactiveInterval() - 최대허용시간 invalidate() - 세션 제거 < 타임아웃 설정하기 > - 일정 시간 동안 요청이 없으면 세션을 제거한다  1. DD에서 전체 세션 타임아웃 설정       web.xml 1. DD에서 전체 세션 타임아웃 설정       web.xml <web-app ... >     <servlet>        ...

java 특정 디렉토리에 있는 파일 목록을 읽어내기, 정렬해서 가져오기

폴더 리스트 가져오기 String path="C:\"; File dirFile=new File(path); File []fileList=dirFile.listFiles(); for(File tempFile : fileList) {   if(tempFile.isFile()) {     String tempPath=tempFile.getParent();     String tempFileName=tempFile.getName();     System.out.println("Path="+tempPath);     System.out.println("FileName="+tempFileName);     /*** Do something withd tempPath and temp FileName ^^; ***/   } } 정렬해서 가져오기 import java.io.FileFilter; import java.io.IOException; import java.util.Arrays; import java.util.Date; import org.apache.commons.io.comparator.LastModifiedFileComparator; import org.apache.commons.io.filefilter.FileFileFilter; public class LastModifiedFileComparatorTest { public static void main(String[] args) throws IOException { File directory = new File("."); // get just files, not directories File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE); System.out.println("Defaul...

dmesg 메시지 실시간으로 보기

참조사이트 http://imitator.kr/Linux/556 # tail -f /var/log/messages # tail -f |dmesg //기본 2초 단위로 갱신 된다. # watch "dmesg | tail -f" //1초 단위로 갱신하면서 보여준다. # watch -n 1 "dmesg | tail -f" // 보여주는 줄을 20으로 늘린다. (기본 10줄) # watch -n 1 "dmesg | tail -f -n 20"