2012-06-08 22 views
9

साथ group_concat मैं तीन टेबल है:शामिल हों और तीन टेबल

users:  sports:   user_sports: 

id | name  id | name   id_user | id_sport | pref 
---+-------- ---+------------ --------+----------+------ 
1 | Peter  1 | Tennis    1 |  1 | 0 
2 | Alice  2 | Football   1 |  2 | 1 
3 | Bob  3 | Basketball   2 |  3 | 0 
             3 |  1 | 2 
             3 |  3 | 1 
             3 |  2 | 0 

तालिका user_sports लिंक users और sports एक (pref) वरीयता के क्रम के साथ।

मैं एक प्रश्न है कि इस रिटर्न बनाने की जरूरत है:

id | name | sport_ids | sport_names 
---+-------+-----------+---------------------------- 
1 | Peter | 1,2  | Tennis,Football 
2 | Alice | 3   | Basketball 
3 | Bob | 2,3,1  | Football,Basketball,Tennis 

मैं JOIN और GROUP_CONCAT साथ की कोशिश की है, लेकिन मैं अजीब परिणाम प्राप्त।
क्या मुझे नेस्टेड क्वेरी करने की ज़रूरत है?
कोई विचार?

+2

क्या आप अपना group_concat दिनचर्या पोस्ट कर सकते हैं जो काम नहीं करता है? ऐसा लगता है कि आपको वही चाहिए (इस पृष्ठ को देखें: http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field), तो यह सहायक हो सकता है पूछताछ देखें o यह निर्धारित करता है कि यह गलत कैसे हुआ। – user158017

उत्तर

24

इसका विशेष रूप से कठिन नहीं।

  1. जॉइन क्लॉज का उपयोग करके तीन तालिकाओं में शामिल हों। आप में रुचि रखते हैं खेतों पर
  2. उपयोग group_concat।
  3. या क्षेत्रों आप श्रृंखलाबद्ध नहीं कर रहे हैं पर GROUP BY क्लॉज़ मत भूलना weird things will happen


SELECT u.id, 
     u.Name, 
     Group_concat(us.id_sport order by pref) sport_ids, 
     Group_concat(s.name order by pref)  sport_names 
FROM users u 
     LEFT JOIN User_Sports us 
       ON u.id = us.id_user 
     LEFT JOIN sports s 
       ON US.id_sport = s.id 
GROUP BY u.id, 
      u.Name 

DEMO

अद्यतन बाएं जॉइन जब उपयोगकर्ता के पास प्रवेश नहीं होता है टिप्पणियों के अनुसार उपयोगकर्ता_Sports में ries

+0

कमाल! Sqlfiddle – Peter

+1

के लिए +1 क्यों एक आंतरिक शामिल होने के बजाय एक बाएं शामिल हो? और एक 'समूह द्वारा' पर्याप्त लगता है: http://sqlfiddle.com/#!2/4d402/9 – Peter

+0

आंतरिक जुड़ने आमतौर पर बाएं जुड़ने से बेहतर प्रदर्शन करते हैं, इसलिए मैं वहां से शुरू करता हूं। क्या आप उन उपयोगकर्ताओं में दिलचस्पी रखते हैं जो sports_users में मौजूद नहीं हैं? –

3

मुझे लगता है कि यह सिर्फ एक सरल में शामिल होने और एकत्रीकरण है:

select u.id, u.name, group_concat(s.name order by pref separator ',') 
from user_sports us join 
    users u 
    on us.id_user = u.id join 
    sports s 
    on us.id_sport = s.id 
group by u.id, u.name 
संबंधित मुद्दे