2008-08-31 14 views
11

साथ गणना मैं तीन टेबल है: पेज, लगाव, पेज-लगावएसक्यूएल क्वेरी, 0 गिनती

मैं इस तरह डेटा है:

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 हिस्सा कैसे प्राप्त करूं?

उत्तर

25

अपने "आंतरिक जुड़ने" को "बाएं बाहरी जुड़ने" में बदलें, जिसका अर्थ है "मुझे शामिल होने के बाईं ओर सभी पंक्तियां प्राप्त करें, भले ही दाईं ओर एक मिलान पंक्ति न हो।"

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

डेविड बी उल्लेख किया है कि इस प्रश्न नहीं चलता है। समूह को 'group.name' द्वारा समूह में बदलें – edosoft

1

आप एक आंतरिक जुड़ने के बजाय बाएं शामिल होना चाहते हैं, क्योंकि यह रिकॉर्ड मौजूद नहीं है।

1

LEFT शामिल आपका मित्र है। विभिन्न प्रकार के प्रकारों के बारे में अधिक जानने के लिए http://en.wikipedia.org/wiki/Join_(SQL)

8

उप-क्वेरीिंग का उपयोग करके एक और समाधान है।

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

धन्यवाद! मेरे लिए ठीक काम करता है! – tienbuiDE

2

डेटाबेस के आधार पर, गति के लिए, आप यूनियन कमांड का उपयोग कर सकते हैं।

एसक्यूएल लंबा है, लेकिन, डेटाबेस के आधार पर, यह चीजों को "गिनती चीजों की गिनती" और "ऐसी चीजों की गिनती" से अलग करता है जो "वहां नहीं हैं"।

(
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 मिलियन से अधिक संलग्नक हैं। यूनियन ने इसे इतने लंबे समय तक 13 सेकेंड में चलाया, जब तक मैं ऊब गया और एक और रास्ता कोशिश की (बाहरी जुड़ने और सबक्वायरी विधियों को मारने से पहले कहीं 60 सेकंड से ऊपर)।

0

इस का उपयोग करें:

SELECT p.name,(
    SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber 
FROM page p 
संबंधित मुद्दे