2011-03-21 13 views
7

मेरे पास ऐसी कई टेबल हैं जो इस तरह दिखती हैं: (id, user_id, object_id)। मुझे अक्सर इस सवाल में दिलचस्पी है कि "कितने उपयोगकर्ताओं के पास एक वस्तु है? कितने में दो हैं? आदि" और वितरण देखना चाहते हैं।सबक्वायरी का उपयोग किए बिना जॉइन टेबल से गणना के हिस्टोग्राम कैसे प्राप्त कर सकते हैं?

यह करने के लिए स्पष्ट जवाब लगता है:

select x.ucount, count(*) 
from (select count(*) as ucount from objects_users group by user_id) as x 
group by x.ucount 
order by x.ucount; 

इस तरह परिणाम का उत्पादन: एक सबक्वेरी का उपयोग

ucount | count 
-------|------- 
1  | 15 
2  | 17 
3  | 23 
4  | 104 
5  | 76 
7  | 12 

यहाँ मेरे लिए असजीला लगता है और मैं यह पता लगाने की निर्माण करने के लिए कैसे करना चाहते हैं बिना एक ही परिणाम। इसके अलावा, यदि आप जो सवाल पूछने की कोशिश कर रहे हैं वह थोड़ा अधिक जटिल है, तो यह सबकुछ से अधिक जानकारी पास करने में गन्दा हो जाता है। उदाहरण के लिए, अगर आप चाहते हैं डेटा आगे उपयोगकर्ता के निर्माण तिथि के आधार पर वर्गीकृत:

select 
    x.ucount, 
    (select cdate from users where id = x.user_id) as cdate, 
    count(*) 
from (
    select user_id, count(*) as ucount 
    from objects_users group by user_id 
) as x 
group by cdate, x.ucount, 
order by cdate, x.ucount; 

वहाँ किसी तरह सबक्वेरी के विस्फोट से बचने के लिए है? मुझे लगता है कि अंत में मेरा आपत्ति सौंदर्यशास्त्र है, लेकिन यह प्रश्नों को पढ़ने और कठिन लिखने में कठोर बनाता है।

+0

क्या RDBMS और संस्करण का उपयोग कर रहे हैं? – Lamak

+0

मैं postgresql9 का उपयोग कर रहा हूं लेकिन मैंने किसी भी पोस्टग्रेस-आईएमएस से बचने की कोशिश की। मुझे बताएं कि क्या मैंने कुछ पर्ची छोड़ी है :-) –

उत्तर

1

मुझे लगता है कि आपके आरडीबीएमएस के बावजूद, एक सबक्वायरी ऐसा करने का बिल्कुल सही तरीका है। यह सुरुचिपूर्ण क्यों होगा?

दूसरी क्वेरी के लिए, बस इस तरह users तालिका में शामिल होने:

SELECT 
x.ucount, 
u.cdate, 
COUNT(*) 
FROM (
SELECT 
    user_id, 
    COUNT(*) AS ucount 
FROM objects_users 
GROUP BY user_id 
) AS x 
LEFT JOIN users AS u 
ON x.user_id = u.id 
GROUP BY u.cdate, x.ucount 
ORDER BY u.cdate, x.ucount 
+0

एक अन्य दृष्टिकोण आपके लिए हिस्टोग्राम-आईएनजी करने के लिए एक रिपोर्टिंग टूल का उपयोग करना होगा। (एक्सेल या एसएसआरएस) – Jody

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