2011-02-27 3 views
11

मान लीजिए कि मैं निम्न तालिका संरचना है दो:समान क्वेरी में दो कॉलम गिनती करने के लिए क्या यह संभव है

    :

    t1 
    ------------- 
    id // row id 
    userID_follower // this user is a follows another member 
    userID_following // other member that this user 
    

    यह निम्न दोनों गठबंधन करने के लिए एक एकल क्वेरी चलाने के लिए संभव है

  1. कितने उपयोगकर्ताओं ने इस व्यक्ति t1 कहां userID_follower = से

    चयन COUNT (आईडी) पीछा कर रहा है "। $ MyID।" । "

  2. कि कितने उपयोगकर्ताओं t1 से इस व्यक्ति को

    चयन COUNT (आईडी) का पालन कहां userID_following ="। $ MyID। "

धन्यवाद।

उत्तर

44

MySQL में, आप SUM() समारोह एक शर्त पर, उपयोग कर सकते हैं के बाद से एक झूठी हालत 0 करने के बराबर होगा, और एक सच्चे एक 1 करने के बराबर होगा:

SELECT SUM(userID_follower = $myID) AS followerCount, 
    SUM(userID_following = $myID) AS followingCount 
FROM t1 
WHERE userID_follower = $myID 
    OR userID_following = $myID 
+1

हे भगवान! यह 'कहां' खंड पर पूरे चयन को फ़िल्टर किए बिना सबसेट की गणना करने पर इतना अधिक रोमांच देता है। बहुत बहुत धन्यवाद! – C4u

+0

आपको कहां क्लॉज की आवश्यकता है? –

+0

@IstiaqueAhmed कॉलम अनुक्रमित किया जाना चाहिए। एक पूर्ण टेबल स्कैन करने की कोई आवश्यकता नहीं है। –

1

मुझे लगता है कि ऐसा कुछ काम करना चाहिए:

select ownerID, count(distinct userID_follow), count(distinct userID_following) from t1 group by ownerID 
+0

ओह, तुम सही हो, लेकिन मैं कैसे गिनती मूल्य मिलता है? क्या मैं एएस cont1 और AS cnt2 के रूप में होगा? – santa

+0

हां, 'गिनती (विशिष्ट userID_follow) के रूप में cnt1' काम करना चाहिए। – SiggyF

2

मैं के साथ दो पंक्तियों लौटने की सलाह देते हैं प्रत्येक पंक्ति पर एक गिनती, दो कॉलम के बजाय:

SELECT 'follower', COUNT(*) AS count FROM t1 WHERE userID_follower = ? 
UNION ALL 
SELECT 'following', COUNT(*) FROM t1 WHERE userID_following = ? 

यह एक पतित समाधान की तरह लग सकता है, लेकिन कारण यह है कि अगर userID_follower और userID_following सूचकांक हैं एड, यह इंडेक्स का उपयोग कर सकते हैं। यदि आप अन्य उत्तरों में दिखाए गए परिणामों को दो कॉलम में प्राप्त करने का प्रयास करते हैं, तो इंडेक्स का उपयोग नहीं कर सकते हैं और उन्हें टेबल-स्कैन करना होगा।

अन्य सुझावों उस प्रश्न का स्पर्शरेखा हैं:

  • इस मामले में COUNT (आईडी) का उपयोग कर के लिए कोई लाभ नहीं है।
  • आपको अपनी क्वेरी में $ myID को इंटरपोल करने के बजाय SQL क्वेरी पैरामीटर का उपयोग करना चाहिए।
+0

'इंडेक्स का उपयोग नहीं कर सकता है और टेबल-स्कैन करना है', यह गलत है। Http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization देखें।एचटीएमएल –

+0

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

8

अधिक Hoyle (आईएसओ) समाधान एक मामला अभिव्यक्ति का उपयोग कर होगा:

Select Sum(Case When userID_follower = $myID Then 1 Else 0 End) As followerCount 
    , Sum(Case When userID_following = $myID Then 1 Else 0 End) As followingCount 
From t1 
Where userID_follower = $myID 
    Or userID_following = $myID 
+0

घटना को केस की आवश्यकता नहीं थी क्योंकि मेरा कॉलम एक int था। धन्यवाद! – Dan

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