2008-12-29 29 views
9

Tôi đang cố viết một truy vấn MySQL lấy một bản ghi từ bảng "dự án" có quan hệ một-nhiều với bảng "thẻ". Đơn đăng ký của tôi sử dụng 4 bảng để làm việc này:Có thể ghép các chuỗi từ nhiều hàng và bảng vào một cột kết quả không?

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

Có thể viết truy vấn theo cách nhiều giá trị từ bảng "Thẻ" được nối vào một cột kết quả không? Tôi muốn làm điều này mà không cần sử dụng truy vấn phụ.

Bảng rõ:

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

mong muốn kết quả:

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

Trả lời

20

thấy GROUP_CONCAT

dụ:

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

Câu trả lời hay, điều này hoạt động như một sự quyến rũ! Cảm ơn. –

3

Tôi không biết nếu nó hoạt động trong MySQL, nhưng trong SQL Server bạn có thể sử dụng một thủ thuật cho việc này:

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

Sau đó, chọn chính

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

Kết quả của đường dây SELECT @csv = @csv + ',' + foo.SomeColumn@csv trở thành danh sách được phân tách bằng dấu phẩy của tất cả các bản ghi phù hợp từ bảng nguồn (sau khi biến vị ngữ).

Đáng thử trong MySQL?

+0

Cảm ơn bạn đã trả lời nhanh chóng; điều này có vẻ giống như một mẹo hữu ích, nhưng tôi muốn sử dụng một truy vấn đơn (nếu có thể). –

+0

dán nó vào một hàm và gọi nó là nội dòng. – StingyJack

Các vấn đề liên quan