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 27616 게시물 읽기
No. 27616
테이블3개 조인시 키를 그룹으로 묶으면서 카운트구하는 쿼리 도와주세요.
작성자
김명현
작성일
2008-06-22 23:51
조회수
7,844

2개만 묶어서 할때는 결과가 잘나오는데,
3개 조인할때 중복되면서 원하는 결과가 안나옵니다 도와주세요.


테이블구조 no는 일련번호 auto_increment

 tA        tB        tC   
--------  --------  --------
 no key    no key    no key
--------  --------  --------
 1   1     1   1     1   3
 2   1     2   1     2   3
 3   2     3   1     3   1
 4   3     4   2     4   2
--------   5   2    --------  
          --------


원하는 결과값

 key  count(b.no)  count(c.no)
-------------------------------
 1       3            1
 2       2            1
 3       0            2 
-------------------------------

해본 쿼리 이거랑 비슷하게 이것저것 해봤는데 안됩니다.
select a.key, count(b.no), count(c.no) from tA
left join tB on tB.key=tA.key 
left join tC on tC.key=tA.key
group by a.key


create table tA(
`no` integer not null auto_increment,
`key` integer not null default 1,
primary key(`no`));
insert into tA(key) values(1),(1),(2),(3);

create table tB(
`no` integer not null auto_increment,
`key` integer not null default 1,
primary key(`no`));
insert into tA(key) values(1),(1),(1),(2),(2);

create table tC(
`no` integer not null auto_increment,
`key` integer not null default 1,
primary key(`no`));
insert into tA(key) values(3),(3),(1),(2);

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

테이블 로우수가 많다면 성능은 좋지 않겠네요.


select a.key, (select count(`key`) from tB where `key` = a.key) as cnt_b_no, (select count(`key`) from tC where `key` = a.key) as cnt_c_no from tA a group by a.key;

trinity님이 2008-06-23 11:28에 작성한 댓글입니다. Edit

위에 답을 달아주신 분의 query대로 수행을 하면 

tB, tC 테이블에 대한 access가 상당히 많이 일어날 것으로 보여서 

아래와 같이 사용을 해보시면 어떨까 싶습니다.


select taa.`key`, ifnull( tbb.cnt, 0 ) AS cntBno, ifnull( tcc.cnt, 0 ) AS cntCno

from ( select distinct `key` from tA ) AS taa

left join ( select `key`, count(*) as cnt from tB group by `key` ) AS tbb ON taa.`key` = tbb.`key`

left join ( select `key`, count(*) as cnt from tC group by `key` ) AS tcc ON taa.`key` = tcc.`key`;

우욱님이 2008-06-24 12:46에 작성한 댓글입니다. Edit

답변 감사합니다. 그런데 혹시 서브쿼리 안쓰고는 안되는겁니까??
mysql버전이 4.때여서 서브쿼리가 지원이 안됩니다.

김명현님이 2008-06-24 20:40에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
27621한 행의 내용 제한 옵션? [2]
유승효
2008-06-24
3364
27618이런경우 조인쿼리를 어떻게 해야 하나요? [10]
김수정
2008-06-23
4576
27617디비업데이트와 추가시 소요시간의 차이? [1]
김수정
2008-06-23
3486
27616테이블3개 조인시 키를 그룹으로 묶으면서 카운트구하는 쿼리 도와주세요. [3]
김명현
2008-06-22
7844
27615insert 후 select만 일어날때 어떤 DBMS가 가장 빠를까요? [2]
DB
2008-06-21
3587
27614Mysql Out Join 질문입니다. [3]
최원일
2008-06-20
3819
27613오류 메시지 해석 좀 부탁드려요... [1]
조진희
2008-06-19
3608
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다