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
운영게시판
최근게시물
MS-SQL Q&A 1008 게시물 읽기
No. 1008
[질문] 공통키를 가진 세개의 테이블간의 count 합이 가장 큰 데이타 뽑아 내기
작성자
이사영
작성일
2003-10-29 11:21
조회수
4,958

안녕하세요?
오늘은 쿼리에 대해서 여쭤볼 게 있습니다.

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를 사용하고 있습니다.

 

부탁드리겠습니다.

 

좋은 하루 되시고...오늘 하루도 많이 웃으세요.
감사합니다.

[Top]
No.
제목
작성자
작성일
조회
1011월별 나이대별 통계구하기 [1]
초보자
2003-10-31
5783
1010전체 텍스트 인덱스에서 원래 테이블과 join 안하는 법 질문임다
이충희
2003-10-31
4966
1009레코드가 insert 된 날짜와 시간을 얻을 수는 없을까요? (간절합니다... ㅠㅠ;) [1]
pipiband
2003-10-29
7004
1008[질문] 공통키를 가진 세개의 테이블간의 count 합이 가장 큰 데이타 뽑아 내기
이사영
2003-10-29
4958
1007mysql이 실행이 안되요..ㅜㅜ
초보자
2003-10-29
4339
1006MS-SQL 7 에서 엔터프라이즈 매니저 질문입니다.
guest
2003-10-29
4212
1005원격 접속 문제
정은경
2003-10-28
5192
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다