2013-12-17 6 views
6

यहाँ MySQLFiddle:MySQL ही तालिका में शामिल होने और की तुलना परिणाम

तालिका 1:: user_answers तालिका (विभिन्न प्रश्नों के भंडार उन जवाब)

http://sqlfiddle.com/#!2/15d447/1

मैं एक एकल तालिका के साथ मैं काम करने की कोशिश कर रहा हूँ है

संग्रहित किए गए उल्लेखनीय मान उपयोगकर्ता आईडी (कॉलम uid) हैं, प्रश्न के उत्तर के लिए प्रश्न आईडी (कॉलम quid), प्रश्न का उत्तर (कॉलम answer) और उनके उत्तर का महत्व (कॉलम importance)।

अंतिम परिणाम मैं चाहता हूँ:

मैं चाहूँगा सभी सवालों कि किसी भी दो उपयोगकर्ताओं के उत्तर दिए हैं, कि या तो नहीं अन्य पार्टी द्वारा उत्तर दिया गया सवाल से कोई जवाब को छोड़कर हड़पने के लिए सक्षम होने के लिए, या उसी प्रश्न के उत्तर जिनके पास importance में उपयोगकर्ता के लिए 1 का मान है। दोबारा, यह कभी-कभी एक समय में दो उपयोगकर्ताओं की तुलना करने के लिए उपयोग किया जाएगा।

मैं अपने प्रयास में असफल रहे सुंदर किया गया है, लेकिन यहाँ मैं क्या कोशिश की है, सिर्फ बातें एक साथ piecing है:

#attempt one: trying to exclude answers that were not answered by both users 
SELECT * FROM user_answers AS uid1 
JOIN user_answers AS uid2 ON uid1.uid = uid2.uid 
WHERE uid1.uid = 1 
AND uid2.uid = 20008 
AND uid1.quid IS NOT NULL 
AND uid2.quid IS NOT NULL; 

यह कोई परिणाम है, लेकिन मैं वास्तव में यकीन है कि क्यों नहीं कर रहा हूँ।

#attempt two: trying to exclude where answers are the same for both users 
SELECT * FROM user_answers AS uid1 
LEFT JOIN user_answers AS uid2 ON (uid1.uid = uid2.uid AND uid1.answer <> uid2.answer) 

यह मुझे परिणाम देता है, लेकिन शामिल होने के कारण सब कुछ पर दोगुनी लग रहा है। मैंने किसी भी उत्तर को खत्म करने के इस प्रयास में भी कोशिश की, जो कि समान था, जो कि उस अर्थ में काम कर रहा है।

किसी भी मार्गदर्शन की सराहना की जाती है।

धन्यवाद।

+3

+1। । । "मेरा एसक्यूएल फिडल यहाँ है" शुरू करने वाला कोई प्रश्न कैसे ऊपर नहीं उठा सकता है? –

उत्तर

3

आप एकत्रीकरण क्वेरी का उपयोग कर अपने प्रश्न का उत्तर दे सकते हैं। विचार उन स्थितियों के लिए पंक्तियों को फ़िल्टर करने के लिए having खंड का उपयोग करना है जो आप देख रहे हैं।

क्योंकि आप सब पर importance = 1 उन के साथ सवालों के एक where खंड का उपयोग कर फ़िल्टर किए जाते हैं में कोई दिलचस्पी नहीं कर रहे हैं:

select ua.quid 
from user_answers ua 
where importance <> 1 and uid in (1, 20008) 
group by ua.quid 
having sum(uid = 1) > 0 and 
     sum(uid = 20008) > 0; 

आप उत्तर शामिल करना चाहते हैं, तो आप कर सकते हैं:

select ua.quid, 
     group_concat(concat(uid, ':', answer) order by uid) as answers 
+1

वास्तव में शामिल होने से बचने का अच्छा तरीका।हालांकि, व्यक्तिगत रूप से अलग-अलग कॉलम के रूप में दोनों पक्षों का उत्तर होगा, 'GROUP_CONCAT (IF (uid = 1, answer,' ') SEPARATOR' ') ए 1, GROUP_CONCAT (IF (uid = 1, answer,' ') के रूप में SEPARATOR '') के रूप में A2' – Wrikken

+0

ओह, बीटीडब्ल्यू, 2 उपयोगकर्ताओं के लिए 2 'SUM' के – Wrikken

+0

@cjaredrun के बजाय 'COUNT (विशिष्ट यूआईडी) = 2' भी हो सकता है। । । 'चयन' कथन में 'quid' के बाद आप एक अल्पविराम गायब हैं। –

0
बस

आपको जो चाहिए वह एक साधारण संस्करण है।

select * 
from user_answers a, 
     user_answers b 
where a.quid = b.quid 
    and a.uid <> b.uid 
    and 1 not in (a.importance, b.importance) 

आप फ़िल्टर करना चाहते हैं, बस सवाल सिर्फ बदलने के लिए *distinct a.quid

इसे यहाँ देखें बेला पर: http://sqlfiddle.com/#!2/15d447/15

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