2012-09-08 9 views
11

मेरे पास 2 कॉलम वाली एक तालिका है (नीचे देखें)। एक सदस्य एक प्रश्न के कई प्रतिक्रियाओं हो सकता है:एक जॉइन टेबल से कैसे पूछें ताकि एकाधिक मानदंडों को पूरा किया जा सके?

RESPONSES 
--------- 
member_id INT 
response_id INT 
SAMPLE DATA 
member_id -- response_id 
    1  --  3 
    1  --  5 
    2  --  1 
    2  --  5 
    2  --  9 
    3  --  1 
    3  --  5 
    3  --  6 

मैं क्या करने की जरूरत सदस्य है कि सभी मानदंडों को पूरा प्रतिक्रिया के लिए तालिका क्वेरी है। उदाहरण के लिए मैं सभी सदस्यों की 1 और 5. मैं निम्न क्वेरी का उपयोग कर रहा एक RESPONSE_ID है कि चयन करने की आवश्यकता:

SELECT DISTINCT member_id 
FROM responses 
WHERE response_id = 1 AND response_id = 5 

मैं member_id के 2 और 3 हालांकि मैं हो रही है कुछ भी नहीं वापस पाने के लिए उम्मीद करेंगे लौट आए। मैंने एक्सप्लाइन का इस्तेमाल किया और यह दिखाता है कि मेरी कहां क्वेरी में एक त्रुटि है। मैं क्या गलत कर रहा हूं?

इसके अलावा, क्या ऐसा कोई कार्य है जहां सत्य को वापस करने के लिए सभी मानदंडों को पूरा किया जाना चाहिए?

+0

मैं इसे देखना रूप में, आप की जरूरत है 'OR' बजाय' की AND' वहाँ। – hjpotter92

+1

आपकी WHERE स्थिति प्रत्येक पंक्ति पर व्यक्तिगत रूप से लागू होती है। नतीजतन, यह कभी भी सच नहीं हो सकता है, क्योंकि एक कॉलम एक ही समय में 1 और 5 के बराबर नहीं हो सकता है। –

उत्तर

10

यह काम करना चाहिए:

SELECT member_ID 
FROM responses 
WHERE response_ID IN (1,5) 
GROUP BY member_ID 
HAVING COUNT(DISTINCT response_id) = 2 

आप अभिलेखों की संख्या लौटे जो आपके IN खंड में आपूर्ति किए गए मान की संख्या के बराबर है गिनती करने के लिए की जरूरत है।

SQLFiddle Demo

+2

'हैविंग COUNT (DISTINCT respond_id) = 2' उस मामले को पकड़ता है जहां सदस्य ने दो बार समान मूल्य का उत्तर दिया है। – podiluska

+0

@ पॉडिलुस्का हाँ सही, मैंने इस वाक्यांश को अनदेखा किया 'सदस्य को एक प्रश्न के लिए कई प्रतिक्रियाएं हो सकती हैं'। आपका धन्यवाद। –

+1

यह इस बात का पालन नहीं करता है कि एक सदस्य के पास एकाधिक * समान * प्रतिक्रियाएं हो सकती हैं। फिर भी, ओपी स्पष्ट नहीं करता है कि समान प्रतिक्रियाएं संभव हैं या नहीं, इसलिए सुरक्षित पक्ष पर होना बेहतर है और 'COUNT (DISTINCT)' का उपयोग करना बेहतर है। लेकिन मैं अपने जवाब में स्पष्ट करता हूं कि यदि कई समान प्रतिक्रियाओं को असंभव होने की गारंटी दी जाती है, तो 'DISTINCT' कुछ ओवरहेड जोड़ता है, इसलिए 'COUNT (*)' बेहतर होगा। –

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

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