2012-10-10 6 views
5

मैं उन है कि टीवी के एक ही सेट का आनंद के जोड़े को खोजने के लिए कोशिश कर रहा हूँ इस सरल उदाहरण में से पता चलतामैं उन जोड़ों को कैसे ढूंढूं जो एक गुण (कॉलम) को एकाधिक tuples (पंक्तियों) के माध्यम से साझा करते हैं?

चलो कहते हैं कि मैं एक मेज जिसमें प्रत्येक उपयोगकर्ता प्रत्येक टीवी शो है कि वे आनंद के लिए एक प्रवेश हो जाता है करते हैं:

|USER1 |USER2 | 
|------|------| 
|001 |003 | 
|003 |001 | 
|002 |005 | 
|002 |006 | 
|005 |002 | 
|005 |006 | 
|006 |002 | 
|006 |005 | 

या एक और भी बेहतर संस्करण होगा:

|USER1 |USER2 | 
|------|------| 
|001 |003 | 
|002 |005 | 
|002 |006 | 
|005 |006 | 

तब मैं का एक परिणाम चाहते हैं

कौन सा मूल रूप से कहते हैं: उपयोगकर्ता 1 उपयोगकर्ता 3.

मैं चारों ओर ग्रुप द्वारा और शामिल हों के साथ खेल किया गया है के रूप में शो के एक ही सेट पसंद है, लेकिन मैं अभी भी इस सवाल का जवाब :(नहीं मिल रहा।

अब तक, मैंने पाया कि

SELECT s1.User as USER1, s2.User as USER2, s1.Show as Show 
FROM Shows s1 JOIN (SELECT * FROM Shows) s2 
ON s1.Shows=s2.Shows AND s1.User!=s2.User; 

का उपयोग कर जो उपयोगकर्ताओं के जोड़े और शो वे आम में है अर्जित करता है। लेकिन मुझे नहीं पता कि यहां से कहाँ जाना है।

+1

हमें दिखाएं कि आप किसके साथ खेल रहे हैं। – Kermit

+0

मुझे लगता है कि अपेक्षित परिणाम प्रदत्त नमूना डेटा से मेल नहीं खाता है। नमूना डेटा में आपके पास 6 उपयोगकर्ता हैं लेकिन केवल दो टीवी शो हैं और अपेक्षित परिणाम में यह इसके विपरीत है। –

+0

USER1 के रूप में चयन s1.User, USER2 रूप s2.User, s1.Show दिखाएँ शो से एस 1 शामिल हों के रूप में (का चयन करें * \t शो से) s2 पर s1.Shows = s2.Shows और s1.User! = S2 .User; यह कम से कम एक ही टीवी शो की तरह जोड़े की एक सूची उत्पन्न करता है। @DanielHilgarth मैं उन सभी उपयोगकर्ताओं को जोड़ना चाहता हूं जो सभी टीवी शो देखते हैं।उपयोगकर्ता 1 और उपयोगकर्ता 3 दोनों खोया और दक्षिण पार्क देखो। उपयोगकर्ता 2 और उपयोगकर्ता 5 दोनों घड़ी खो गया। उपयोगकर्ता 2 और उपयोगकर्ता 6 दोनों खोया देखो। आदि –

उत्तर

4

आप सारणीबद्ध परिणामों के बजाय सीएसवी स्वीकार कर सकते हैं, तो आप बस समूह दो बार तालिका सकता है:

SELECT GROUP_CONCAT(User) FROM (
    SELECT User, GROUP_CONCAT(DISTINCT `Show` ORDER BY `Show` SEPARATOR 0x1e) AS s 
    FROM  Shows 
    GROUP BY User 
) t GROUP BY s 

अन्यथा, आप अपने आप को ऊपर सबक्वेरी शामिल हो सकते हैं:

SELECT DISTINCT LEAST(t.User, u.User) AS User1, 
      GREATEST(t.User, u.User) AS User2 
FROM (
    SELECT User, GROUP_CONCAT(DISTINCT `Show` ORDER BY `Show` SEPARATOR 0x1e) AS s 
    FROM  Shows 
    GROUP BY User 
) t JOIN (
    SELECT User, GROUP_CONCAT(DISTINCT `Show` ORDER BY `Show` SEPARATOR 0x1e) AS s 
    FROM  Shows 
    GROUP BY User 
) u USING (s) 
WHERE t.User <> u.User 

उन पर देखें sqlfiddle

बेशक

, अगर डुप्लिकेट (User, Show) जोड़े की गारंटी हैShows तालिका में मौजूद नहीं है, तो आप GROUP_CONCAT() एकत्रित से DISTINCT कीवर्ड को हटाने के द्वारा प्रदर्शन में सुधार कर सकते हैं।

+0

बस कोशिश की और यह बहुत अच्छा काम किया! धन्यवाद! मुझे नहीं पता था कि GROUP_CONCAT जैसी चीजें भी मौजूद थीं। –

+0

@ हार्टएस, मैंने आपके मनोरंजन के लिए एक और जवाब जोड़ा है। – Jodrell

0

इस अधिक मैंने सोचा, क्या हुआ अगर मैं समूहों, वर्गीकृत किया

select 
    group_concat( 
     User 
     order by User 
     separator ', ' 
    ) LikeViewers 
    , Shows 
from 
(
select 
     User 
    , group_concat(
     concat('"', Show, '"') 
     order by Show 
     separator ', ' 
     ) Shows 
    from 
    Viewings 
    group by 
    User 
) ViewerGroups 
group by 
    Shows 

जो इस

|LikeViewers |Shows    | 
|-------------|--------------------| 
|002, 005, 006|"Lost"    | 
|001, 003  |"Lost", "South Park"| 
|004   |"South Park"  | 

की तरह एक उत्पादन का उत्पादन बेशक, परिणाम और अधिक reuseable लेकिन मैंने सोचा कि हो सकता है पर सोच के बाद यह एक दिलचस्प विचार था।

Fiddle Here

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

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