2011-09-22 22 views
5

मेरे पास भाषा/टेम्पलेट आईडी की एक साधारण तालिका है:MySQL बाएं सबसेलेक्ट में शामिल हों

भाषा | टेम्पलेट

एन, t1
एन, t1
औ, t2
जीई, t3
एन, t1
जीई, t2
जीई, t3

खाका हमेशा होता है या तो T1, T2, या टी 3। कुल मिलाकर 3 भाषाएं हैं: एन, एयू, जीई।

वहाँ बहुत सारे तालिका में अधिक जानकारी, मैं सिर्फ दिखा रहा है कि इस प्रश्न के लिए प्रासंगिक है, मैं रेखांकन के लिए डेटा का उपयोग किया जाएगा और इसलिए यह इस प्रारूप में लौटने की जरूरत है:

एन, टी 1, 3
एन, टी 2, 0
एन, t3, 0
औ, टी 1, 0
औ, T2, 1
औ, t3, 0
जीई, टी 1, 0
जीई, T2, 1
जीई, टी 3, 2

यह गणना करता है हालांकि प्रत्येक भाषा में कई टेम्पलेट घटनाएं होती हैं। लेकिन, तालिका में उस विशेष भाषा के लिए कोई टेम्पलेट आईडी नहीं है, तो मेरी समस्या शून्य गिनती लौट रही है।

मुझे लगता है कि यह सुनिश्चित करने के लिए कि टेम्पलेट आईडी पर उप-चयन में कुछ प्रकार की बाएं शामिल हों, यह सुनिश्चित करने के लिए कि प्रत्येक भाषा के लिए 3 टेम्पलेट आईडी वापस आ जाए?

+0

आप एसक्यूएल क्यों नहीं लिखते हैं, इसलिए हम देख सकते हैं कि (या अगर) त्रुटियां हैं? – Martin

+0

क्या कोई टेम्पलेट टेबल और/या एक भाषा तालिका भी है? या यह एक तालिका इस डेटा का एकमात्र स्रोत है? –

+0

एक.template, गिनती के रूप में गिनती, a.template, गणना करें, a.language, तालिका से बाएं शामिल हों (तालिका से अलग (टेम्पलेट) चुनें) b a.template = b.template समूह पर a.template द्वारा , a.language द्वारा a.language ऑर्डर, a.template – StuR

उत्तर

5

ऐसा करने का एक बेहतर तरीका हो सकती है, और मैं MySQL में यह परीक्षण नहीं किया है, लेकिन SQL सर्वर 2005 में निम्न काम करता है :

au t1 0 
au t2 1 
au t3 0 
en t1 3 
en t2 0 
en t3 0 
ge t1 0 
ge t2 1 
ge t3 2 
:

Select a.language, b.template, count (c.template) as combo_count 
from 
(select distinct language from tablename) as a 
inner join (select distinct template from tablename) as b on 1 < 2 /* this could be cross join, same thing. */ 
left outer join tablename c on c.language = a.language and c.template = b.template 
group by a.language, b.template 
order by 1, 2 

यहाँ अपने नमूना डेटा के साथ परिणाम हैं 0

+0

बिल्कुल सही, बस मैं क्या था और MySQL में ठीक काम करता है। आपकी सहायता के लिए धन्यवाद. – StuR

0
Select a.language, a.template, Count(*) count 
    From (Select Distinct language, template From table) a 
    Left Join table b 
     On b.language = a.language 
      And b.template = b.template 
    Group By a.language, a.template 
+0

I मैंने यह कोशिश की है हालांकि मैं अभी भी वही प्राप्त कर रहा हूं क्योंकि मैं अपनी उपरोक्त टिप्पणी (शून्य मूल्यों) में क्वेरी का उपयोग नहीं करूँगा। साथ ही, भाषा पर पहले समूह क्यों नहीं होना चाहिए, यह एक .emplate, a.भाषा? – StuR

0

आपको दो टेबलों की आवश्यकता है जो भाषा और टेम्पलेट के संभावित मूल्यों को सूचीबद्ध करते हैं।

CREATE TABLE language (...) AS SELECT DISTINCT language FROM your_table; 
CREATE TABLE template (...) AS SELECT DISTINCT template FROM your_table; 

तो फिर तुम कुछ इस तरह कर सकते हैं:

SELECT l.language, t.template, SUM(CASE WHEN yours.language IS NULL THEN 0 ELSE 1 END) count 
FROM language l CROSS JOIN template t 
LEFT OUTER JOIN your_table yours ON l.language = yours.language AND t.template = yours.template 
GROUP BY l.language, t.template; 
+1

दो तालिकाओं का उपयोग करने के समान ही होगा: "से (तालिका से अलग (भाषा) का चयन करें) एल क्रॉस जॉइन (तालिका से अलग (टेम्पलेट) का चयन करें) टी" आपके उपरोक्त कोड में नहीं होगा? मैंने इसे एक बार दिया है हालांकि मुझे नीचे दिए गए उत्तर के समान परिणाम मिलते हैं। – StuR

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