database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29671 게시물 읽기
No. 29671
사용자별로 최신글 몇 개씩 뽑아오기
작성자
박상길(hayarobi)
작성일
2010-05-27 14:28
조회수
8,174

 최종 목적을 쓰자면요, 게시판이라고 하면 게시판의 사용자별로 최신글 세 개씩 뽑아오는 쿼리를 만들려고 합니다.

 

SELECT * FROM post WHERE userId = :userid ORDER BY postId desc LIMIT 3;

이 쿼리를 프로그램 상에서 for반복문으로 모든 사용자별로 다 돌릴 수는 없는 노릇이라서요. 사실 모든 사용자에 대해 다 가져오는 것은 아니고, 뽑아오려는 사용자의 userId를 배열로 받아옵니다. (적게는 1개고 최대 50 개쯤 될 듯 하네요.)  

 

아는 사람에게 도움을 구했더니, 오라클에서는 RANK() OVER (...)를 이용하면 된다고 하던데 mysql에는 그게 없군요. UNION을 이용해도 쿼리 하나로는 될 것 같은데, 그걸 쓰자니 사용자가 많으면 쿼리가 너무 길어지고 속도도 안 나올 듯 해서요. (for 돌리는 것 보다야 빠를 것 같긴 하지만...)

 

이 글에 대한 댓글이 총 1건 있습니다.

이런 종류의 처리는 만병통치약 같은게 없어서, 상황에 맞춰 하는 것이 좋은 것 같습니다.

 

오라클에서도 RANK() 써도, 빠르게 수행되지는 않으리라 생각됩니다. userId를 기준으로 클러스터드 정렬 되어 있으면 모를까요. ( 오라클은 전혀 모릅니다. 다만 그럴 것 같은 생각이 드네요. )

 

다음과 같이 해보시는 건 어떨까요.

 

1. 글 입력할 때, 미리 구해놓는다.

- userId:postId를 1:N으로 설정한 테이블에, 글 쓰는 순간 가장 오래된 글의 Id를 삭제하고, 새 Id를 추가하면 되겠습니다.

 

2. 글이 십만개 미만이면, 그냥 IN 사용

SELECT postId FROM post WHERE userId IN ( ... ) 으로 구해온 다음, 스크립트 레벨에서 3개씩 자르던가, 아니면 userId로 정렬하고, 변수 써서 3개씩만 가져오도록 서브쿼리 하면 되겠습니다.

 

박현우(lqez)님이 2010-06-03 05:56에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29678mysql 튜닝정보인데 몇번씩 손본건데도 어렵네요.. [1]
진짜친구
2010-05-31
8876
29677중국어 입력문제입니다. 알려주세요 [1]
김종수
2010-05-31
6832
29672group by 또는 distinct 질문드려요~~ [1]
초보쟁이
2010-05-27
7114
29671사용자별로 최신글 몇 개씩 뽑아오기 [1]
박상길
2010-05-27
8174
29670myi,frm,myd 또 ibdata 에 대해서 [1]
짜집기
2010-05-26
6881
29669mssql 에서 mysql 로 변경 중인데요..like 문이 .... [1]
최유환
2010-05-25
7156
29668급질문 MYSQL 초보인데요 [1]
이양욱
2010-05-25
10452
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다