MySQL

2010-08-14 13 views
5

में समान रुचियों को कैसे गिनना है मेरे पास 2 टेबल, 'रुचियां' और 'users_interests' हैं।MySQL

'user_interests' में userid और interestid फ़ील्ड हैं। 'रुचियों में सिर्फ id और name है।

मुझे केवल उपयोगकर्ता आईडी ढूंढने की आवश्यकता है जिनके पास 3 से अधिक रुचि आईडी सामान्य हैं। मुझे बताया गया है कि एक स्व-जुड़ाव शामिल है, लेकिन मुझे यह काम करने के लिए प्रतीत नहीं होता है।

किसी ने कहा कि कुछ इस तरह काम कर सकता था:

SELECT 
     others.userid 
    FROM interests AS user 
    JOIN interests AS others 
     USING(interestid) 
    WHERE user.userid = 2 
    GROUP BY 
     others.userid 
    ORDER BY COUNT(*) DESC 

लेकिन मैं इसके साथ कोई किस्मत हो रही है।

उत्तर

5
SELECT ui.userid, COUNT(*) AS common_interests 
FROM users_interests ui 
WHERE ui.interestid IN (
    SELECT ui2.interestid FROM users_interests ui2 WHERE ui2.userid = 2 
) 
AND ui.userid <> 2 
GROUP BY ui.userid 
HAVING common_interests > 3; 

नोट

+0

कमाल कोड में userid हम पर हमारे खोज आधारित कर रहे हैं (2) दो स्थानों पर की घटना! इसके लिए धन्यवाद, यह खूबसूरती से काम करता है! – Ryan

2

आपने कहा सामान्य में 3 से अधिक ब्याज आईडी, तो आपका मतलब है "कम से कम 4", है ना?

SELECT first1.userid, second1.userid 
FROM users_interests first1, users_interests second1, 
    users_interests first2, users_interests second2, 
    users_interests first3, users_interests second3, 
    users_interests first4, users_interests second4 
WHERE 
    first2.userid=first1.userid AND first3.userid=first1.userid AND first4.userid=first1.userid AND 
    second2.userid=second1.userid AND second3.userid=second1.userid AND second4.userid=second1.userid AND 
    first1.userid<>second1.userid AND 
    first1.interestid=second1.interestid AND 
    first2.interestid=second2.interestid AND first2.interestid<>first1.interestid AND 
    first3.interestid=second3.interestid AND first3.interestid<>first2.interestid AND first3.interestid<>first1.interestid AND 
    first4.interestid=second4.interestid AND first4.interestid<>first3.interestid AND first4.interestid<>first2.interestid AND first4.interestid<>first1.interestid 

जब से मैं इस परीक्षण नहीं किया कृपया याद रखें कि उसमें त्रुटियों हो सकता है, इसलिए केवल इसका इस्तेमाल करता है, तो आप इसे समझते हैं।

यदि आपको अन्य सामान्य रुचियों के लिए समान आवश्यकता है, तो मुझे यकीन है कि आप किसी भी संख्या के लिए इस क्वेरी को गतिशील रूप से उत्पन्न करने के लिए कोड लिख सकते हैं। इसके अलावा, अगर आपको ब्याज नाम नाम की आवश्यकता है, तो मुझे यकीन है कि आप interests तालिका में आवश्यक चार जोड़ों को जोड़ सकेंगे और SELECT खंड में प्रासंगिक कॉलम जोड़ सकेंगे।