2008-12-29 23 views
9

Tablo "etiketler" ile bire çok ilişkisi olan tablo "projeler" bir kayıt alır bir MySQL sorgusu yazmaya çalışıyorum.Dizeleri birden çok satır ve tablodan bir sonuç sütununa birleştirmek mümkün mü?

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

o tablodan birden değerler "Etiketler" bir sonuç sütununda halinde birleştirilmiş şekilde sorguyu yazmak mümkün mü: My uygulama bunu yapmak için 4 tablolar kullanır? Bunu alt sorgular kullanmadan yapmayı tercih ederim.

Tablo açıklama:

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

İstenilen sonuç:

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

cevap

20

bkz GROUP_CONCAT

örnek: Hızlı cevap için

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

Harika cevap, bu bir çekicilik gibi çalışır! Teşekkürler. –

3

o MySQL çalışıp çalışmadığını bilmiyorum, ama SQL Server Bunun için bir hile kullanabilirsiniz:

DECLARE @csv varchar(max) 
SET @csv = '' 
SELECT @csv = @csv + ',' + foo.SomeColumn 
FROM [FOO] foo 
WHERE foo.SomeId = @SomeId 
Ana seçicide,
SELECT ..., @csv AS [Tags] 
FROM ... 

SELECT @csv = @csv + ',' + foo.SomeColumn satırının sonucu, @csv, kaynak tablodan (yüklemeden sonra) eşleşen tüm kayıtların virgülle ayrılmış listesi haline gelir.

MySQL'de denemeye değer mi?

+0

sayesinde; Bu yararlı bir hile gibi görünüyor, ancak tek bir sorgu kullanmayı tercih ediyorum (eğer mümkünse). –

+0

bir işlevle yapıştırın ve satır içi olarak adlandırın. – StingyJack