안녕하세요? 오늘은 쿼리에 대해서 여쭤볼 게 있습니다.
asp + access로 된 사이트인데요...
(access 게시판이 없어서 부득이하게 여기다가 올립니다.
access가 ms-sql과 가장 유사해서요.)
동호회 입니다.
동호회 메인 페이지에는 best 동호회가 출력이 되어지는데요...
best 동호회는... 가장 글을 많이 올린 동호회이고, 동호회에서 글을 올릴 수 있는 곳은 게시판, 자료실, 공지사항입니다.
동호회, 게시판, 자료실, 공지사항은 서로 다른 테이블로 분리가 되어 있구요. 각 테이블은 c_num(동호회 번호를 나타내는 필드)로 연결이 되어 있습니다.
동호회 : community (공통 필드 : c_num) 게시판 : community_board (공통 필드 : c_num) 자료실 : community_pds (공통 필드 : c_num) 공지사항 : community_notice (공통 필드 : c_num)
공통 필드 : c_num
한번의 쿼리로 가장 많은 글을 올린 (게시판, 자료실, 공지사항에) 동호회의 동호회 일련번호를 얻어내는 것이 목적입니다.
아래는 제가 시도해 보고 있는 쿼리입니다.
select top 1 (select count(c_num) from community_board where c_num=A.c_num) as bbs_cnt, (select count(c_num) from community_pds where c_num=A.c_num) as pds_cnt, (select count(c_num) from community_notice where c_num=A.c_num) as notice_cnt, sum(bbs_cnt+pds_cnt+notice_cnt) as total_cnt, A.c_num as community_num from community A where A.c_adminok='Y' group by A.c_num order by sum(bbs_cnt+pds_cnt+notice_cnt) desc, A.c_num asc
where절의 c_adminok이란 필드는 관리자의 동호회에 대한 승인여부로 쿼리의 대상이 되는 동호회는 관리자가 승인한 동호회입니다.
ms-sql에서는 sum()등의 함수로도 정렬이 가능한 것으로 알고 있는데요... 위와 같은 쿼리를 access에서 실행을 시키면.... bbs_cnt, pds_cnt, notice_cnt라는 alias를 인식하지 못합니다.
혹시나 하는 마음에 order by total_cnt desc, A.c_num asc 로 변경해 보았지만, total_cnt란 alias를 인식하지 못하고 에러가 납니다.
방법을 바꿔 네개의 테이블(게시판, 자료실, 공지사항, 동호회)을 조인하여 시도한 쿼리는 아래와 같습니다.
select top 1 (count(A.c_num)+count(B.c_num)+count(C.c_num)) as scount, A.c_num as community_num from community_board A,community_pds B, community_notice C, community D where ( A.c_num=B.c_num and B.c_num=c.c_num and C.c_num=D.c_num and D.c_num=A.c_num) AND D.c_adminok='Y' group by A.c_num order by (count(A.c_num)+count(B.c_num)+count(C.c_num)) desc, A.c_num asc
이런 식으로 쿼리를 주면 order by절의 (count(A.c_num)+count(B.c_num)+count(C.c_num)) desc에서는 오류가 발생하지 않지만, (count(A.c_num)+count(B.c_num)+count(C.c_num)) as scount가 전혀 다른 값을 계산해 내서, 원하는 결과가 얻어지지 않습니다.
그리고 전체 레코드가 모두 같은 값으로 출력됩니다.( top 1을 적용시키지 않고 전체 리스트 보기를 했을 경우, )
마찬가지로, order by scount desc, A.c_num asc 처럼 alias를 쓰면 오류가 납니다.
이리저리 궁리를 해 보아도, 세개의 테이블의 전체 글수를 기준으로 하나의 값을 찾아내는데 뾰족한 방법이 생각하니 않네요.
이번에도...도움을 좀 주시겠어요?
다시 한번 말하지만 access를 사용하고 있습니다.
부탁드리겠습니다.
좋은 하루 되시고...오늘 하루도 많이 웃으세요. 감사합니다. |