2008-08-31 13 views
11

Tôi có ba bảng: trang, tập tin đính kèm, trang tin đính kèmSQL Query, Đếm với 0 đếm

Tôi có dữ liệu như thế này:

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 

Tôi muốn để có được số lượng file đính kèm cho mỗi trang cũng khi số đó là 0. Tôi đã thử với:

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    inner join page-attachment on page.id=page-id 
group by page.id 

Tôi nhận ra điều này:

NAME  ATTACHMENTSNUMBER 
second page 2 
third page 1 

Tôi muốn để có được kết quả này:

NAME  ATTACHMENTSNUMBER 
first page 0 
second page 2 
third page 1 
fourth page 0 

Làm thế nào để tôi có được một phần 0?

Trả lời

25

Thay đổi "tham gia bên trong" thành "tham gia bên ngoài bên trái", có nghĩa là "đưa cho tôi tất cả các hàng ở bên trái của kết nối, ngay cả khi không có hàng phù hợp ở bên phải."

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 
+0

Như David B. đề cập truy vấn này không chạy. Thay đổi nhóm theo 'nhóm theo page.name' – edosoft

1

Bạn muốn tham gia trái, thay vì tham gia bên trong, vì điều đó cho phép các bản ghi không tồn tại.

8

Đây là một giải pháp khác bằng cách sử dụng truy vấn phụ.

SELECT 
    p.name, 
    (
    SELECT COUNT(*) FROM [page-attachment] pa 
    WHERE pa.[PAGE-ID] = p.id 
) as attachmentsnumber 
FROM page p 
+0

cảm ơn! làm việc tốt cho tôi! – tienbuiDE

2

Tùy thuộc vào cơ sở dữ liệu, về tốc độ, bạn có thể sử dụng lệnh UNION.

SQL dài hơn, nhưng, tùy thuộc vào cơ sở dữ liệu, nó tăng tốc độ bằng cách phân tách "đếm những thứ ở đó" và "đếm những thứ không có ở đó".

(
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) 
) 

Cơ sở dữ liệu tôi cần giải pháp này có 20 trang trong hơn một triệu tệp đính kèm. UNION đã chạy nó trong 13 giây thay vì quá lâu, tôi đã chán và thử một cách khác (một nơi nào đó trên 60 giây trước khi tôi giết các phương thức kết nối bên ngoài và truy vấn phụ).

0

Sử dụng này:

SELECT p.name,(
    SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber 
FROM page p