문제
나는 세 가지 테이블:페이지,첨부 파일,페이지 첨부 파일
나는 데이터는 다음과 같다:
page
ID NAME
1 first page
2 second page
3 third page
4 fourth page
attachment
ID NAME
1 foo.word
2 test.xsl
3 mm.ppt
page-attachment
ID PAGE-ID ATTACHMENT-ID
1 2 1
2 2 2
3 3 3
하고 싶의 수를 얻을 첨부 파일당 페이지 또한 때 번호는 0.내가 노력으로:
select page.name, count(page-attachment.id) as attachmentsnumber
from page
inner join page-attachment on page.id=page-id
group by page.id
나이 출력:
NAME ATTACHMENTSNUMBER
second page 2
third page 1
나는 다음과 같이 출력:
NAME ATTACHMENTSNUMBER
first page 0
second page 2
third page 1
fourth page 0
나는 어떻게 얻는 0 부분입니까?
해결책
변경"안"가입하기"왼쪽 외부에 가입하는 것을 의미,""나의 모든 행의 왼쪽에 가입하도 없는 경우에 일치하는 행 오른쪽에 있습니다."
select page.name, count(page-attachment.id) as attachmentsnumber
from page
left outer join page-attachment on page.id=page-id
group by page.name
다른 팁
여기에서 다른 솔루션을 사용하여 하위를 쿼리하.
SELECT
p.name,
(
SELECT COUNT(*) FROM [page-attachment] pa
WHERE pa.[PAGE-ID] = p.id
) as attachmentsnumber
FROM page p
에 따라 데이터베이스에 대한 속도로 사용할 수 있습니다 연합 명령입니다.
SQL 이상,그러나 따라,데이터베이스에서,그것도 물건에 의해 분리"믿는 것은 거기서"그리고"믿지 않는 것을있다".
(
select page.name, count(page-attachment.id) as attachmentsnumber
from page
inner join page-attachment on page.id=page-id
group by page.id
)
UNION
(
select page.name, 0 as attachmentsnumber
from page
where page.id not in (
select page-id from page-attachment)
)
데이터베이스 내가 필요로 이 솔루션은 20 페이지 이상의 백만 첨부 파일이 있습니다.UNION 만든 그것을 실행에서는 13 초보다 그래서 나는 루고 또 다른 방법을 시도(어딘가 60 초간 전에 내가 죽는 외부에 가입하고 하위 방법).
당신이 원하는 왼쪽,가입신의 내면의 가입으로,할 수 있는 레코드를 존재하지 않습니다.
왼쪽에 가입하는 당신의 친구입니다.대한 더 많은 정보는 다른 참여 유형 http://en.wikipedia.org/wiki/Join_(SQL)
이것을 사용:
SELECT p.name,(
SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p
제휴하지 않습니다 StackOverflow