2011-05-24 22 views
6

के साथ जुड़ें वर्तमान में users और programs के समान दो टेबल हैं जो link तालिका के माध्यम से कई से अधिक रिश्तों के माध्यम से जुड़े हुए हैं।कई तालिकाओं में से कई पिवोट

mysql> select * from users; 
+----+----------+ 
| id | name  | 
+----+----------+ 
| 1 | Jonathan | 
| 2 | Little | 
| 3 | Annie | 
| 4 | Bob  | 
+----+----------+ 
4 rows in set (0.00 sec) 

mysql> select * from programs; 
+----+----------------------+ 
| id | name     | 
+----+----------------------+ 
| 1 | Microsoft Word  | 
| 2 | Microsoft Excel  | 
| 3 | Microsoft PowerPoint | 
+----+----------------------+ 
3 rows in set (0.00 sec) 

mysql> select * from link; 
+---------+------------+ 
| user_id | program_id | 
+---------+------------+ 
|  1 |   1 | 
|  1 |   2 | 
|  1 |   3 | 
|  2 |   2 | 
|  3 |   1 | 
|  3 |   4 | 
+---------+------------+ 
6 rows in set (0.00 sec) 

मुझे समझ में तालिकाओं में शामिल होने और इस तरह का एक परिणाम के वापस जाने के लिए कैसे:

mysql> select users.name, programs.name from linker 
    -> join users on users.id = linker.user_id 
    -> join programs on programs.id = linker.program_id; 
+----------+----------------------+ 
| name  | name     | 
+----------+----------------------+ 
| Jonathan | Microsoft Word  | 
| Jonathan | Microsoft Excel  | 
| Jonathan | Microsoft PowerPoint | 
| Little | Microsoft Excel  | 
| Annie | Microsoft Word  | 
+----------+----------------------+ 

लेकिन क्या मैं वास्तव में देख रहा हूँ एक छोटे से अधिक जटिल है:

+----------+-----------------------------------------------------+ 
| name  | name            | 
+----------+-----------------------------------------------------+ 
| Jonathan | Microsoft Word,Microsoft Excel,Microsoft PowerPoint | 
| Little | Microsoft Excel          | 
| Annie | Microsoft Word          | 
+----------+-----------------------------------------------------+ 

मैं मान लें कि GROUP_CONCAT() कहीं कमांड में फेंक दिया गया है, लेकिन मुझे परिणाम इस तरह दिखने से प्रतीत नहीं होता है:

mysql> select users.name, group_concat(programs.name) from linker 
    -> join users on users.id = linker.user_id 
    -> join programs on programs.id = linker.program_id; 
+----------+------------------------------------------------------------------------------------+ 
| name  | group_concat(programs.name)              | 
+----------+------------------------------------------------------------------------------------+ 
| Jonathan | Microsoft Word,Microsoft Excel,Microsoft PowerPoint,Microsoft Excel,Microsoft Word | 
+----------+------------------------------------------------------------------------------------+ 

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

उत्तर

8

आप एक DISTINCT निर्दिष्ट करने के लिए, अर्थात्

select users.name, group_concat(DISTINCT programs.name) 

MySQL डॉक्स here देखें जरूरत है।

को आपकी क्वेरी को बदलने का प्रयास करें:

SELECT users.name, group_concat(programs.name) 
from users 
LEFT JOIN linker on linker.user_id = users.id 
LEFT JOIN programs on linker.program_id = programs.id 
GROUP BY users.id 

यह उन लोगों के साथ जुड़ा कोई कार्यक्रमों के साथ किसी भी उपयोगकर्ता के लिए आप एक null दे देंगे। उन्हें फ़िल्टर करने के लिए, बस WHERE programs.id IS NOT NULL जोड़ें।

+0

यह डुप्लिकेट मानों को समाप्त करता है, लेकिन यह परिणाम को पहली पंक्ति तक सीमित करता है। –

+0

सुनिश्चित नहीं है ... पहले उपयोगकर्ताओं को खींचने का प्रयास करें। – Ryan

+0

उत्तर अपडेट किया गया - उपरोक्त क्वेरी को आजमाएं। – Ryan

0
SELECT users.name, group_concat(programs.name) from linker 
INNER JOIN users on linker.user_id = users.id 
INNER JOIN programs on linker.program_id = programs.id 
GROUP BY users.id; 
+0

यह अभी भी केवल पहली पंक्ति देता है, अतिरिक्त (डुप्लिकेट) प्रोग्राम नाम शामिल हैं। मुझे लगता है कि आदेश के बावजूद समानता परीक्षण का मूल्यांकन उसी तरह किया जाता है। –

+0

@kpsfire आह! हाँ आप सही हैं, मेरी गलती, जब आप बाएं या दाएं शामिल होते हैं तो ऑर्डर महत्वपूर्ण होता है। – PachinSV

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