2011-09-15 14 views
39

यहाँ मेरी सरल एसक्यूएल प्रश्न ...किसी तालिका में प्रत्येक विदेशी-कुंजी आईडी के उदाहरणों की संख्या कैसे गिनें?

है मैं दो तालिकाओं है:

पुस्तकें

------------------------------------------------------- 
| book_id | author | genre | price | publication_date | 
------------------------------------------------------- 

आदेश

------------------------------------ 
| order_id | customer_id | book_id | 
------------------------------------ 

मैं एक प्रश्न है कि रिटर्न बनाने के लिए करना चाहते हैं:

-------------------------------------------------------------------------- 
| book_id | author | genre | price | publication_date | number_of_orders | 
-------------------------------------------------------------------------- 

दूसरे शब्दों में, सभी पंक्तियों में पंक्तियों के साथ प्रत्येक कॉलम को 'number_of_orders' नामक गणना वाले कॉलम के साथ वापस करें जो ऑर्डर तालिका में प्रत्येक पुस्तक की संख्या की गणना करता है। । (एक किताब के आदेश तालिका में पुस्तक परिणाम सेट में सूचीबद्ध किया जाना चाहिए अब तक पाए जाते हैं नहीं होता है, लेकिन "number_of_orders" शून्य होना चाहिए

, मैं इस के साथ आ गया है:

SELECT 
    books.book_id, 
    books.author, 
    books.genre, 
    books.price, 
    books.publication_date, 
    count(*) as number_of_orders 
from books 
left join orders 
on (books.book_id = orders.book_id) 
group by 
    books.book_id, 
    books.author, 
    books.genre, 
    books.price, 
    books.publication_date 

है कि लगभग सही है, लेकिन काफी नहीं है, क्योंकि "number_of_orders" 1 हो जाएगा, भले ही एक किताब के आदेश तालिका में सूचीबद्ध कभी नहीं किया गया है। इसके अलावा, एसक्यूएल के ज्ञान की मेरी कमी को देखते हुए, मैं इस यकीन क्वेरी बहुत अक्षम है।

इस प्रश्न को लिखने का सही तरीका क्या है? (इसके लायक होने के लिए, इसे MySQL पर काम करने की ज़रूरत है, इसलिए मैं किसी भी अन्य विक्रेता-विशिष्ट विशेषताओं का उपयोग नहीं कर सकता)।

अग्रिम धन्यवाद!

उत्तर

62

को आपकी क्वेरी लगभग सही है और यह ऐसा करने के लिए सही तरीके से (और सबसे कुशल)

SELECT books.*, count(orders.book_id) as number_of_orders   
from books 
left join orders 
on (books.book_id = orders.book_id) 
group by 
    books.book_id 

COUNT(*) गिनती में शून्य मान शामिल हो सकते हैं, क्योंकि यह सब मायने रखता है पंक्तियों, जबकि COUNT(orders.book_id) नहीं है क्योंकि यह दिए गए क्षेत्र में नल मानों को अनदेखा करता है।

+2

आपकी आखिरी बयान कुछ भ्रामक हो सकता है। जब COUNT डेटा डेटा एकत्र करता है तो COUNT फ़ंक्शन न्यूल मानों को अनदेखा करता है। कारण COUNT (*) गलत गिनती वापस कर रहा है क्योंकि इसकी एक विशिष्ट कॉलम की बजाय इसकी गिनती पंक्तियां हैं। बस ओपी –

+0

के लिए स्पष्टीकरण देना चाहते हैं उत्तर, thx अद्यतन। – Fabio

+0

@Fabio अन्य तालिका में संबंधित प्रविष्टियों की गिनती के लिए, यह विशेष प्रश्न क्या कहा जाता है? क्या इसका कोई अकादमिक नाम है? –

5

बदलें count(*)count(orders.book_id)

1

आप गलत चीज़ की गिनती कर रहे हैं। आप गैर-शून्य बुक_आईडी की गिनती करना चाहते हैं।

SELECT 
    books.book_id, 
    books.author, 
    books.genre, 
    books.price, 
    books.publication_date, 
    count(orders.book_id) as number_of_orders 
from books 
left join orders 
on (books.book_id = orders.book_id) 
group by 
    books.book_id, 
    books.author, 
    books.genre, 
    books.price, 
    books.publication_date 
4
SELECT b.book_id, 
    b.author, 
    b.genre, 
    b.price, 
    b.publication_date, 
    coalesce(oc.Count, 0) as number_of_orders 
from books b 
left join (
    select book_id, count(*) as Count 
    from Order 
    group by book_id 
) oc on (b.book_id = oc.book_id) 
संबंधित मुद्दे

 संबंधित मुद्दे