2008-12-29 14 views
9

Ich versuche eine MySQL-Abfrage zu schreiben, die einen Datensatz aus der Tabelle "projects" abruft, der eine Eins-zu-viele-Beziehung mit den "Tags" der Tabelle hat. Meine Anwendung verwendet 4 Tabellen, dies zu tun:Ist es möglich, Strings aus mehreren Zeilen und Tabellen in einer Ergebnisspalte zu verketten?

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

Ist es möglich, die Abfrage so, dass mehrere Werte aus der Tabelle „Variablen“ werden verkettet in eine Ergebnisspalte zu schreiben? Ich würde dies lieber tun, ohne Unterabfragen zu verwenden.

Tabelle Klärung:

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

Wunschergebnis:

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

Antwort

20

siehe GROUP_CONCAT

Beispiel:

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

Große Antwort, das funktioniert wie ein Charme! Vielen Dank. –

3

Ich weiß nicht, ob es in MySQL funktioniert, aber in SQL Server können Sie einen Trick verwenden:

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

Dann wählen Sie in der Hauptsache

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

Das Ergebnis der Zeile SELECT @csv = @csv + ',' + foo.SomeColumn ist, dass @csv die durch Kommas getrennte Liste aller übereinstimmenden Datensätze aus der Quelltabelle (nach Prädikat) wird.

Versuchen Sie es in MySQL?

+0

Dank für die schnelle Antwort; das scheint ein hilfreicher Trick zu sein, aber ich würde lieber eine einzige Abfrage verwenden (wenn überhaupt möglich). –

+0

kleben Sie es in eine Funktion und rufen Sie es inline auf. – StingyJack

Verwandte Themen