Kết quả MySQL là danh sách được phân tách bằng dấu phẩy


129

Tôi cần chạy một truy vấn như:

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

Nhưng tôi muốn chọn phụ để trả về một danh sách được phân tách bằng dấu phẩy, thay vì một cột dữ liệu. Điều này thậm chí có thể, và nếu vậy, làm thế nào?

Câu trả lời:


250

Bạn có thể sử dụng GROUP_CONCAT để thực hiện điều đó, ví dụ như một cái gì đó như

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;

10
Ngoài ra, lưu ý nhanh rằng nếu bạn đang sử dụng PHPMyAdmin và muốn xuất danh sách được phân tách bằng dấu phẩy cho trang, hãy sử dụng GROUP_CONCAT(CAST(s.name AS CHAR))nếu không nó sẽ trả về một cái gì đó hoàn toàn không đáng tin [BLOB - 20 Bytes].
devios1

3
Mục đích là tốt và MySQL sẽ cho phép điều này, nhưng hãy cẩn thận (nói chung) với việc bạn sử dụng GROUP BY. Các mục trong danh sách chọn cần phải là tổng hợp hợp lệ trong ngữ cảnh của mệnh đề GROUP BY. Trong trường hợp này, p.name không hoàn toàn hợp lệ. Bất kỳ cơ sở dữ liệu nào tuân thủ tiêu chuẩn SQL sẽ coi đây là lỗi. Trong trường hợp này, sử dụng MAX (p.name) trong danh sách chọn hoặc thêm p.name vào mệnh đề GROUP BY. Vì Paul có thể có nghĩa là p.id để đại diện cho khóa chính hoặc khóa duy nhất, việc thêm p.name vào mệnh đề GROUP BY sẽ không ảnh hưởng đến kết quả cuối cùng.
Jon Armstrong - Xgc

Lưu ý bạn có thể phải thiết lập chiều dài tối đa cho phiên mỗi stackoverflow.com/questions/2567000/...
sobelito

Cảm ơn rất nhiều! Bạn đã giúp tôi rất nhiều!
André Agostinho

11

Thay vì sử dụng, group concat()bạn chỉ có thể sử dụngconcat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

chỉnh sửa này chỉ hoạt động trong myQuery; Oracle concat chỉ chấp nhận hai đối số. Trong oracle bạn có thể sử dụng một cái gì đó như chọn col1 || ',' | | col2 || ',' || col3 làm foobar từ bảng1; trong máy chủ sql bạn sẽ sử dụng + thay vì đường ống.


2
Điều này không hoạt động trong trường hợp GROUP BY, trong khi GROUP_CONCAT () sẽ ghép các nội dung của một cột duy nhất
Aram Paronikyan

5

Bây giờ chỉ có tôi gặp tình huống này và tìm thấy một số tính năng thú vị hơn xung quanh GROUP_CONCAT. Tôi hy vọng những chi tiết này sẽ làm cho bạn cảm thấy thú vị.

GROUP_CONCAT đơn giản

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Kết quả:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

GROUP_CONCAT với DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Kết quả:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

GROUP_CONCAT với DISTINCT và ĐẶT HÀNG B BYNG

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;

Kết quả:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

GROUP_CONCAT với DISTINCT và SEPARATOR

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;

Kết quả:

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

GROUP_CONCAT và cột kết hợp

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;

Kết quả:

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

GROUP_CONCAT và kết quả được nhóm Giả sử rằng sau đây là kết quả trước khi sử dụngGROUP_CONCAT

+------------------------+--------------------------+
| ArtistName             | AlbumName                |
+------------------------+--------------------------+
| Iron Maiden            | Powerslave               |
| AC/DC                  | Powerage                 |
| Jim Reeves             | Singing Down the Lane    |
| Devin Townsend         | Ziltoid the Omniscient   |
| Devin Townsend         | Casualties of Cool       |
| Devin Townsend         | Epicloud                 |
| Iron Maiden            | Somewhere in Time        |
| Iron Maiden            | Piece of Mind            |
| Iron Maiden            | Killers                  |
| Iron Maiden            | No Prayer for the Dying  |
| The Script             | No Sound Without Silence |
| Buddy Rich             | Big Swing Face           |
| Michael Learns to Rock | Blue Night               |
| Michael Learns to Rock | Eternity                 |
| Michael Learns to Rock | Scandinavia              |
| Tom Jones              | Long Lost Suitcase       |
| Tom Jones              | Praise and Blame         |
| Tom Jones              | Along Came Jones         |
| Allan Holdsworth       | All Night Wrong          |
| Allan Holdsworth       | The Sixteen Men of Tain  |
+------------------------+--------------------------+
USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Kết quả:

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

3

Trong trường hợp của tôi, tôi phải ghép tất cả số tài khoản của một người mà số điện thoại di động là duy nhất. Vì vậy, tôi đã sử dụng các truy vấn sau đây để đạt được điều đó.

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber

Kết quả truy vấn dưới đây:

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.