2011-06-05 13 views
6

मेरे लिए जटिल है क्योंकि मैं SQL में नौसिखिया हूं।जटिल एसक्यूएल क्वेरी, कई

मैं तीन टेबल है - Peoples, Interests और Peoples_Interests (अनेक-से-अनेक) - कि निम्नलिखित तरीके से जुड़े हुए हैं: कई Interests के माध्यम से Peoples_Interests
Interest कई PeoplesPeoples_Interests

के माध्यम से है

People है

मुझे पीपुल्स के समान सुझावों के साथ सुझाव देने की ज़रूरत है, जो समान रुचि की मात्रा पर आधारित है। तो उदाहरण:

मुझे बेसबॉल, फुटबॉल और वॉली में रूचि है। मुझे किसी अन्य उपयोगकर्ता के साथ सुझाव मिलना चाहिए जिसमें जितना संभव हो उतना समान हित हो। 3/3 घटनाओं वाले लोग होना चाहिए जो मुझे चाहिए यदि वे मौजूद हैं (यदि नहीं - 2/3 और ऐसे)।

इसलिए मुझे एक प्रश्न की आवश्यकता है कि आउटपुट पीड़ितों की समानता के आधार पर क्रमबद्ध होगा।

अद्यतन: Db संरचना:

रूचियाँ
आईडी
नाम - स्ट्रिंग

पीपुल्स
आईडी
ईमेल

Peoples_Interests
interests_id
people_id

धन्यवाद।

+0

यदि आप easer होगा विस्तार से टेबल डिजाइन पोस्ट किया। – Hogan

उत्तर

3

कुछ ऐसा है।

Select people.id, people.name, count(interest.id) 
from people 
left join people_interests on people.id = people_interests.peopleid 
left join interests on people_interests.interestid = interests.interest.id 
where interests.id in (select id from interests where interests.peopleid = @inputuserid) 
group by people.id, people.name 
order by count(interest.id) 

अंग्रेजी में (जो या यह स्पष्ट नहीं कर सकता है हो सकता है।)

  • व्यक्ति का नाम और हितों की संख्या का चयन करें वे लोगों तालिका से
  • हितों से जुड़ें
  • का हिस्सा तालिका जैसे कि
  • केवल उस व्यक्ति के हितों का मिलान है जिसे हम मिलान करने का प्रयास कर रहे हैं।
  • (लोगों
  • और आदेश से समूह के हितों से मेल खाने वाले की संख्या से।)

उप क्वेरी बिना अपडेट किया गया लेकिन कम स्पष्ट

Select people.id, people.name, count(interest.id) 
from people 
left join people_interests on people.id = people_interests.peopleid 
left join interests on people_interests.interestid = interests.interest.id 
inner join interest i2 on (interests.id = i2.id and i2.people_id = @inputuserid) 
group by people.id, people.name 
order by count(interest.id) 
+0

जो कि में चयन करता है वह MySQL में बहुत धीमी गति से चलने जा रहा है। मैं इसे 'आंतरिक शामिल ब्याज i2 (रुचियों। V = i2.id और i2 पर बदल दूंगा।people_id = @inputuserid) ' – Johan

+0

@johan हाँ इसे एक सबक्वायरी का उपयोग न करने के लिए अद्यतन किया जाना चाहिए, लेकिन मैं उसे स्पष्ट करने की कोशिश कर रहा था। – Hogan

+0

मुझे समझ में आता है पीओवी इतनी +1। – Johan

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