2011-12-29 8 views
5

मैं दो निम्न नमूना डेटा के साथ टेबल है में शून्य मान शामिल करने के लिए:कैसे बाहरी के साथ एक प्रश्न समूह में शामिल हों और इनके द्वारा

Table 1: `item_name` 
| item_id | item_desc | 
| 1  | apple  | 
| 2  | orange | 
| 3  | banana | 
| 4  | grape  | 
| 5  | mango  | 

Table 2: `user_items` 
| user_id | item_id | 
| 127  | 1  | 
| 127  | 2  | 
| 127  | 4  | 
| 128  | 1  | 
| 128  | 5  | 

मैं एक कुल को चुनने के लिए में से प्रत्येक ITEM_ID कोशिश कर रहा हूँ दोनों user_id 127 और 128

SELECT IFNULL(COUNT(ui.user_id), 0) AS total, in.item_desc 
FROM user_items AS ui 
RIGHT OUTER JOIN item_name AS in 
    ON ui.item_id = in.item_id 
WHERE ui.user_id IN (127, 128) 
GROUP BY ui.item_id 
ORDER BY total DESC 

ऊपर क्वेरी का परिणाम है::

| total | item_desc | 
| 2  | apple  | 
| 1  | orange | 
| 1  | grape  | 
| 1  | mango  | 
निम्न क्वेरी का उपयोग कर ITEM_DESC इसी के साथ-साथ है 10

लेकिन इसमें item_id 3, केला शामिल नहीं था, जिसे मैं सही बाहरी जॉइन के साथ पुनर्प्राप्त करना चाहता था।

| total | item_desc | 
| 2  | apple  | 
| 1  | orange | 
| 1  | grape  | 
| 1  | mango  | 
| 0  | banana | 

वहाँ ऊपर इच्छित परिणाम के साथ समाप्त करने के लिए क्वेरी को संशोधित करने का कोई तरीका है: मैं एक नतीजा यह है कि इस तरह से देखा पाने के लिए उम्मीद कर रहा था? आपके समय के लिए धन्यवाद।

उत्तर

4

आपका WHERE खंड यह है के रूप में अनिवार्य रूप से item_name से सभी रिकॉर्ड को हटा रहा है कि user_id के 127 & 128.

से संबंधित नहीं आदेश है कि ठीक करने के लिए, सबसे आसान समाधान item_name से LEFT JOIN होगा user_items तालिका में तालिका और JOIN पर user_id का चयन लागू करें।

SELECT COUNT(*), itn.item_desc 
FROM item_name AS itn 
     LEFT OUTER JOIN user_items AS ui ON ui.item_id = itn.item_id 
              AND ui.user_id IN (127, 128) 
GROUP BY 
     itn.item_desc 

ध्यान दें कि जबकि यह एक RIGHT OUTER JOIN के रूप में लिखा जा सकता है, मैं उस प्रकार खोजने के counterintuitive होने के लिए जुड़ जाता है और केवल उन्हें का उपयोग करते समय बिल्कुल जरूरी पर सलाह देंगे।

+1

+1। इन उपनामों से सावधान रहें;) –

+1

आह आपको बहुत धन्यवाद, लिवन! और धन्यवाद निक, मेरा उदाहरण उपनाम वास्तव में बुरा था, यह इंगित करने के लिए धन्यवाद! – Tom

6

गिनती का उपयोग करके आपकी क्वेरी में थोड़ी सी त्रुटि थी। यह काम।

select count(ui.item_id) as total, in.item_desc 
from item_name `in` 
     left join user_items ui on ui.item_id = in.item_id 
             and ui.user_id in (127, 128) 
group by 
     in.item_desc 
order by total desc 
+0

मुझे त्रुटि दिखाई नहीं दे रही है? afaik, 'COUNT (*)' किसी भी 'ग्रुप बाय' व्यवस्था (कम से कम SQL सर्वर में) के साथ मान्य एसक्यूएल है। –

+0

यदि आप अपनी क्वेरी का परीक्षण करते हैं तो आप देखेंगे कि आपके पास केला 1 होगा;; –

+0

मैं इसका परीक्षण नहीं कर सकता लेकिन अब मुझे पता है कि आपका क्या मतलब है। तुम सही हो। इसके लिए +1। –

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