2012-05-17 12 views
6

मैं अपने डेटाबेस में दो तालिकाओं है एक उपयोगकर्ता की जानकारी (users_table) रखने के लिए और दूसरा मित्र का ट्रैक रखता गिनतीएक मित्र सूची क्वेरी में सुधार: परस्पर मित्र

users_table:

id username  avatar 
1   max  max.jpg 
2   jack  jack.jpg 

friends_table:

id u1_id  u2_id 
1   1   2 
2   1   3 

हर उपयोगकर्ता प्रोफ़ाइल में मैं उसकी/उसके मित्र सूची दिखाने के लिए

012,

यहाँ मेरी क्वेरी ($ PROFILE_ID)

select u.id, 
    u.username, 
    u.avatar 
from friends_table f 
join users_table u on f.u1_id = u.id || f.u2_id = u.id 
where u.id <> $profile_id 
    and (f.u1_id = $profile_id || f.u2_id = $profile_id) 

इस क्वेरी प्रोफ़ाइल का स्वामी के दोस्तों का चयन करता है और उन्हें अब मैं चाहता हूँ प्रत्येक दोस्त उपयोगकर्ता नाम और अवतार

प्राप्त करने के लिए उपयोगकर्ता की मेज के साथ शामिल हो प्रत्येक मित्र और प्रोफाइल मालिक के बीच पारस्परिक मित्रों की गिनती करने के लिए यह एक प्रश्न में संभव है या क्या मुझे प्रत्येक स्थापित मित्र के लिए कुछ लंबी और शायद धीमी क्वेरी करना चाहिए (यह सिर्फ एक उदाहरण है और इसमें कुछ वाक्यविन्यास त्रुटि हो सकती है):

 foreach ($friends_list_query_resul as $qr){ 
     $friend_id = $qr['id']; 

     $mutual_count = mysql_query 
    ("select count(*) from friends_table where 
    ($u1_id = $friend_id || $u2_id = $friend_id) 
       && 


    ($u1_id IN (SELECT `u1_id`,`u2_id` from friends_table where 
    ($u1_id = $profile_id || $u2_id = $profile_id)) 

|| 

     $u2_id IN (SELECT `u1_id`,`u2_id` from friends_table where 
    ($u1_id = $profile_id || $u2_id = $profile_id)) 


     ") 
     } 
+9

पूंजी अक्षरों से डरें ... – Lix

+0

मेरी सलाह है कि प्रत्येक आईडी के मित्र की सूची निकालें, और php के साथ आम दोस्तों के बीच मैच बनाते हैं, एमएसक्यूएल अन्य प्रोग्रामिंग भाषाओं की तुलना में धीमी है जब यह डेटा में हेरफेर करने के बारे में है। – jcho360

+0

@ jcho360 खराब सलाह। डाटाबेस इस तरह के इन-मेमोरी दृष्टिकोण से कहीं ज्यादा बेहतर पैमाने पर स्केल कर सकते हैं। जब डेटाबेस डेटा में हेरफेर करने के बारे में है, तो डेटाबेस "अन्य प्रोग्रामिंग भाषाओं की तुलना में धीमे नहीं होते हैं", वास्तव में वे आमतौर पर बहुत तेज़ होते हैं, * अगर * सही ढंग से उपयोग किया जाता है। –

उत्तर

0

मैंने तालिका के प्रत्येक मित्र संबंध के लिए दो पंक्तियां जोड़ने का निर्णय लिया है।

id u1_id  u2_id 
1   10   20 
2   20   10 

यह प्रक्रिया आसान और तेज बनाता है।

+1

वाह, यह नहीं पता था कि किसी के अपने सवालों का जवाब देना कानूनी है ... किसी भी तरह, अगर आपको इसकी आवश्यकता हो तो दोस्ती का अनुरोध करने की जानकारी को सुरक्षित रखना सुनिश्चित करें –

0

सबसे पहले, मुझे समझ नहीं आता क्यों इतनी जटिल क्वेरी उपयोगकर्ता के दोस्तों पुनः प्राप्त करने के ... यह बस इस क्वेरी के द्वारा प्राप्त किया जाना चाहिए:

select u.id, 
    u.username, 
    u.avatar 
from friends_table f 
left join users_table u on f.u2_id = u.id 
where f.u1_id = $profile_id 

के बारे में बताएं: उपयोगकर्ता में लॉग इन किया है जिसकी आईडी है f.u1_id जैसा ही है। इसलिए हम केवल उन मित्रों का चयन करते हैं जिनके आईडी f.u2_id में हैं।

फिर, मेरे दोस्तों में परस्पर मित्र गिनती करने के लिए हम इस तरह क्वेरी का उपयोग कर सकते हैं:

select count(*) as mutual_count, f.u1_id as mutual_friend_id 
from friends_table f 
where f.u1_id IN (select f.u2_id from friends_table where f.u1_id = {$profile_id}) 

जहां $ PROFILE_ID उपयोगकर्ता के प्रवेश की आईडी है ...

यह सही है?

+0

वास्तव में, पहली क्वेरी के बारे में, '$ profile_id'' f.u2_id' कॉलम – pomeh

+0

हां में भी हो सकता है , ज़ाहिर है, क्योंकि यह कई संबंधों में है, लेकिन जब यह 'f.u2_id' में है, तो इसका मतलब है कि मैं किसी ऐसे व्यक्ति का मित्र हूं जिसका आईडी' f.u1_id' है - यह संबंध हमारे लिए कोई मायने नहीं रखता है (या नहीं होना चाहिए) बस मेरे दोस्तों को उठाते समय ... उन उपयोगकर्ताओं को नहीं जिनके मैं मित्र हूं ... – shadyyx

+0

यह सुनिश्चित नहीं है! मुझे लगता है कि यह उपयोग के मामले पर निर्भर करता है। @ मैक्स आपको क्या लगता है? – pomeh

1

आपका पहला प्रश्न भी लिखा जा सकता है:

select distinct u.id, 
     u.username, 
     u.avatar 
    from users_table u where u.id in 
     (select case when u1_id=$profile_id then u2_id else u1_id end 
     from friends_table f where case when u1_id=$profile_id 
     then u1_id else u2_id end =$profile_id); 

परस्पर मित्र क्वेरी इसी तरह के फैशन में एक भी प्रश्न के रूप में लिखा जा सकता है:

select u.id, (select count(f.id) from friends f where 
    case when f.u1_id=u.id then u2_id else u1_id end in 
     (select distinct case when u1_id=$profile_id then u2_id else u1_id end 
     from friends where case when u1_id=$profile_id then u1_id else u2_id 
     end =$profile_id) 
    and u1_id=u.id or u2_id=u.id and 
    (u1_id <> $profile_id and u2_id <> $profile_id)) 
as mutual_frnds from user u where u.id <> $profile_id; 

लेकिन आप प्रदर्शन परीक्षण करने के लिए या तो चाहते हो सकता है उपयोग करने से पहले उनमें से।

+0

मैं उप क्वेरी का उपयोग किए बिना ऐसा करने की उम्मीद कर रहा था। मैं प्रदर्शन की जांच करने और देखने जा रहा हूँ। rex – max

1

आपको बस एक क्वेरी है:

select id, username, avatar, -- ... 
(
    select count(*) 
    from friends_table f1 
    inner join friends_table f2 on f1.u2_id = f2.u1_id and f2.u2_id = f1.u1_id 
    where f1.u1_id = users_table.id 
) 
as mutual_friend_count 
from users_table 

सबक्वेरी का अर्थ है:

मुझे संबंधों उपयोगकर्ता में भाग लेता है, जैसे कि "एक दोस्त के दोस्त" की गिनती दें पहले मित्र संबंध का लक्ष्य दूसरे मित्र संबंध का स्रोत है, और दूसरे मित्र संबंध का लक्ष्य पहले का स्रोत है।

+1

thanx के लिए thanx लेकिन मुझे लगता है कि यह काम करने के लिए मुझे डेटाबेस में डेटा संग्रहीत करने के तरीके को बदलना होगा। अभी प्रत्येक उपयोगकर्ता प्रत्येक संबंध के लिए u1_id या u2_id में हो सकता है, इसलिए मुझे दोनों को जांचना है और मैं सिर्फ यू 1_आईडी का चयन नहीं कर सकता। – max

+0

यदि आपको पारस्परिक फ्रांसिश संबंधों को गिनना है, तो इसका मतलब है कि आप जो दोस्ती संबंध संग्रहित कर रहे हैं, वह यात्रा नहीं करते हैं, यानी, यदि यू 1 यू 2 का मित्र है, तो इसका मतलब यह नहीं है कि यू 2 यू 1 का मित्र है। यदि वे यात्रा नहीं करते हैं, तो जोड़ी (u1, u2) जोड़ी (u2, u1) जैसी ही नहीं है। जिस तरह से मैं इसे देखता हूं, आपके दोस्तों_टेबल में एक कॉलम संबंध का "स्रोत" होना चाहिए, और दूसरा "लक्ष्य" होना चाहिए। मैं क्या खो रहा हूँ? –

+0

बात यह है कि दोस्ती यात्रा करता है। अगर मैं आपको अपना दोस्त बनने के लिए कहता हूं और आप स्वीकार करते हैं, तो आप मेरे दोस्त हैं और मैं तुम्हारा हूँ। कम से कम यह है कि यह मेरे कोड – max

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