2009-06-09 15 views
8

0 के अंक के चर सेट के आधार पर MySQL रिकॉर्ड्स पुनर्प्राप्त करना मान लें कि मेरे पास एक MySQL तालिका है, people। प्रत्येक रिकॉर्ड में favourite_colour, country, और age_group के बीच विभिन्न गुण शामिल हैं।तुलना

मैं क्या करना चाहता हूं इस तालिका से रिकॉर्ड को विशिष्ट पैरामीटर के सेट पर समानता से पुनर्प्राप्त करना है। "लाल", "संयुक्त राज्य" और "18-25" को देखते हुए, उदाहरण के लिए, सर्वोत्तम परिणाम उन रिकॉर्ड होंगे जो तीनों से मेल खाते हैं। ये 100% मैच होंगे।

हालांकि, मैं दो पैरामीटर (66% मैच), या किसी भी पैरामीटर (33% मैच) के किसी भी संयोजन से मेल खाने वाले रिकॉर्ड पुनर्प्राप्त करना चाहूंगा। इसके अलावा, मैं तुलना के अतिरिक्त बिंदुओं को परिभाषित करने में सक्षम होना चाहता हूं (उदा। underwear_type, marital_status, आदि)।

क्या इस समस्या का अपेक्षाकृत कुशल समाधान है?

उत्तर

11

हां, आपको प्रत्येक तुलना, जैसे favourite_colour='Red' & सी, के 0 (गलत) या 1 (सही) एक मूल्य में बदल सकते हैं - mysql यह परोक्ष करना होगा, लेकिन व्यापकता के लिए आप चाहते हो सकता है CAST((favourite_colour='Red') AS INTEGER) और सी; फिर, आप SUM इन सब से, यानी,

SELECT 
userId, 
SUM((favourite_colour='Red'), 
    (country='US'), 
    (age_group='18-25')) AS match_score 
FROM people 
WHERE match_score >= 2 
ORDER BY match_score DESC 

आप सही मैचों पहले दे देंगे, 2-के-3 अगले; और भी जांच करने के लिए सामान्यीकृत करने के लिए आसान! -)

+0

यह काफी चालाक है! –

+0

यह वास्तव में एक बहुत अच्छा विचार है। परिणामों में से एक को गुणा करके वजन घटाना भी आसान होगा। –

+0

यह वास्तव में एक अच्छा समाधान है। कुछ नोट्स/प्रश्न: जो मैं बता सकता हूं, एसक्यूएल कॉलम उपनाम (यानी match_score) को WHERE क्लॉज में अनुमति नहीं देता है। साथ ही, मुझे नहीं लगता कि एसयूएम() व्यवहार करता है क्योंकि आपकी क्वेरी सुझाव देगी (यह एकाधिक तर्क स्वीकार नहीं करती है); MySQL के दस्तावेज़ से संकेत मिलता है कि SUM() केवल एक समूह द्वारा समेकन फ़ंक्शन है। WHERE क्लॉज को हटाकर, और अतिरिक्त ऑपरेटर के साथ योग को प्रतिस्थापित करने से फ़ंक्शन एक आकर्षण की तरह काम करता है। –

0

के लिए तीन पहले आसान है:

select * from people 
where 
(case when color = 'Red' then 33 else 0 end + 
case when age_group = '18-25' then 33 else 0 end + 
case when country = 'United States' then 33 else 0 end)>=33 

मैं "तुलना की अतिरिक्त अंक" भाग समझ में नहीं आता है, तो आप व्याख्या कर सकते हैं?

+0

यह बहुत उपयोगी या सुरुचिपूर्ण नहीं है। –

+0

एलेक्स के समाधान की तुलना में, मुझे सहमत होना चाहिए! लेकिन यह वैसे भी काम करता है। – tekBlues

+0

यही कारण है कि सबसे अच्छा समाधान खोजने के लिए StackOverflow यहां है :)। –

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