2008-12-29 12 views
9

मैं एक MySQL क्वेरी कि तालिका "परियोजनाओं" तालिका "टैग" के साथ एक एक-से-कई संबंध है से एक रिकॉर्ड को पुन: प्राप्त लिखने की कोशिश कर रहा हूँ।यह एक परिणाम स्तंभ में एकाधिक पंक्तियों और टेबल से तार जोड़ करना संभव है?

Projects - the projects table 
Entities - entity table; references several application resources 
Tags - tags table 
Tag_entity - links tags to entities 

क्या यह संभव है इस तरह से क्वेरी लिखने के लिए उस तालिका से एक से अधिक मान "टैग" एक परिणाम स्तंभ में concatenated रहे हैं: मेरा आवेदन 4 टेबल यह करने के लिए उपयोग करता है? मैं सबक्वेरी का उपयोग किए बिना यह कर पसंद करेंगे।

टेबल स्पष्टीकरण:

         ------------- 
            | Tag_Entity | 
-------------  ----------  | ----------- |  ------- 
| Projects |  | Entities |  | - id  |  | Tags | 
| ----------- |  | -------- |  | - tag_id |  | ----- | 
| - id  | --> | - id  | --> | - entity_id | --> | id | 
| - entity_id |  ----------  -------------  | name | 
-------------           ------- 

वांछित परिणाम:

Projects.id Entities.id Tags.name (concatenated) 
1    5    'foo','bar','etc' 

उत्तर

20

देख GROUP_CONCAT

उदाहरण:

mysql> SELECT * FROM blah; 
+----+-----+-----------+ 
| K | grp | name  | 
+----+-----+-----------+ 
| 1 | 1 | foo  | 
| 2 | 1 | bar  | 
| 3 | 2 | hydrogen | 
| 4 | 4 | dasher | 
| 5 | 2 | helium | 
| 6 | 2 | lithium | 
| 7 | 4 | dancer | 
| 8 | 3 | winken | 
| 9 | 4 | prancer | 
| 10 | 2 | beryllium | 
| 11 | 1 | baz  | 
| 12 | 3 | blinken | 
| 13 | 4 | vixen  | 
| 14 | 1 | quux  | 
| 15 | 4 | comet  | 
| 16 | 2 | boron  | 
| 17 | 4 | cupid  | 
| 18 | 4 | donner | 
| 19 | 4 | blitzen | 
| 20 | 3 | nod  | 
| 21 | 4 | rudolph | 
+----+-----+-----------+ 
21 rows in set (0.00 sec) 

mysql> SELECT grp, GROUP_CONCAT(name ORDER BY K) FROM blah GROUP BY grp; 
+-----+----------------------------------------------------------------+ 
| grp | GROUP_CONCAT(name ORDER BY K)         | 
+-----+----------------------------------------------------------------+ 
| 1 | foo,bar,baz,quux            | 
| 2 | hydrogen,helium,lithium,beryllium,boron      | 
| 3 | winken,blinken,nod            | 
| 4 | dasher,dancer,prancer,vixen,comet,cupid,donner,blitzen,rudolph | 
+-----+----------------------------------------------------------------+ 
4 rows in set (0.00 sec) 
+0

महान जवाब है, यह एक आकर्षण की तरह काम करता है! धन्यवाद। –

3

मैं अगर यह MySQL में काम करता है पता नहीं है, लेकिन एसक्यूएल सर्वर में आप इस के लिए एक चाल का उपयोग कर सकते हैं:

DECLARE @csv varchar(max) 
SET @csv = '' 
SELECT @csv = @csv + ',' + foo.SomeColumn 
FROM [FOO] foo 
WHERE foo.SomeId = @SomeId 

फिर मुख्य चयन में

SELECT ..., @csv AS [Tags] 
FROM ... 

SELECT @csv = @csv + ',' + foo.SomeColumn लाइन का परिणाम @csv स्रोत तालिका (predicate के बाद) से सभी मिलान रिकॉर्ड की अल्पविराम से अलग सूची बन जाता है।

MySQL में प्रयास करने योग्य मूल्य?

+0

त्वरित उत्तर के लिए धन्यवाद; यह एक उपयोगी चाल की तरह लगता है, लेकिन मैं किसी एक क्वेरी (सभी संभव पर अगर) का उपयोग करना चाहते। –

+0

एक समारोह में यह छड़ी और यह इनलाइन कहते हैं। – StingyJack

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