Làm cách nào để sử dụng GROUP BY để nối chuỗi trong MySQL?


351

Về cơ bản câu hỏi là làm thế nào để có được từ này:

foo_id foo_name
1 A
1 B
2 C

đến đây:

foo_id foo_name
1 AB
2 C

13
TẢI XUỐNG thật khó hiểu khi đặt tên cho một chuỗi cột, đặt cho nó một tên trông giống như một kiểu dữ liệu. Vì vậy, bất kỳ câu trả lời nào cũng bị ảnh hưởng bởi vì các câu trả lời trông giống như chúng đang chỉ định loại dữ liệu khi chúng chỉ định tên cột
barlop

2
@barlop đã sửa lỗi đó bằng cách chỉnh sửa câu hỏi và câu trả lời.
ustun

Câu trả lời:



164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Thêm chi tiết tại đây .

Từ liên kết trên , GROUP_CONCAT: Hàm này trả về kết quả chuỗi với các giá trị không phải NULL được nối từ một nhóm. Nó trả về NULL nếu không có giá trị không phải NULL.


cột kết quả có giới hạn bằng ký tự. xem tại đây và các tài liệu :)
marlo

18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Sẽ cung cấp cho bạn một chuỗi được phân cách bằng dấu phẩy


17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - Trong MySQL, bạn có thể nhận được các giá trị được kết hợp của các kết hợp biểu thức. Để loại bỏ các giá trị trùng lặp, sử dụng mệnh đề DISTINCT . Để sắp xếp các giá trị trong kết quả, hãy sử dụng mệnh đề ORDER BY. Để sắp xếp theo thứ tự ngược lại , hãy thêm từ khóa DESC (giảm dần) vào tên của cột bạn sắp xếp theo mệnh đề ORDER BY. Mặc định là thứ tự tăng dần; điều này có thể được chỉ định rõ ràng bằng cách sử dụng từ khóa ASC. Dấu phân cách mặc định giữa các giá trị trong một nhóm là dấu phẩy (Số, Giàn). Để chỉ định một dấu tách rõ ràng, hãy sử dụng SEPARATOR theo sau là giá trị bằng chuỗi ký tự nên được chèn giữa các giá trị nhóm. Để loại bỏ hoàn toàn dải phân cách, chỉ định SEPARATOR '' .

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

HOẶC LÀ

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

15

Kết quả được rút ngắn theo độ dài tối đa được đưa ra bởi biến hệ thống group_concat_max_len, có giá trị mặc định là 1024 ký tự, vì vậy trước tiên chúng tôi thực hiện:

SET group_concat_max_len=100000000;

và sau đó, ví dụ:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

Kết quả được cắt ngắn theo độ dài tối đa được đưa ra bởi biến hệ thống group_concat_max_len, có giá trị mặc định1024 ký tự. tài liệu
marlo

Phạm vi của group_concat_max_lencấu hình này là gì? Kết nối / phiên hiện tại, hoặc nó sẽ ảnh hưởng đến các khách hàng khác?
Ngọn lửa đông lạnh

@F FrozenFlame:> Nếu không có sửa đổi, SET thay đổi biến phiên. Nếu biến không có giá trị phiên, sẽ xảy ra lỗi. Từ dev.mysql.com/doc/refman/5.7/vi/USE-system-variables.html
arminrosu

3
Điều này không trả lời câu hỏi của OP mà chỉ thêm thông tin hữu ích. Đây phải là một bình luận, không phải là một câu trả lời.
Sean the Bean

1
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Vịt Donald

11

Câu trả lời tuyệt vời. Tôi cũng gặp vấn đề với NULLS và đã cố gắng giải quyết vấn đề đó bằng cách bao gồm COALESCE bên trong GROUP_CONCAT. Ví dụ như sau:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

Hy vọng điều này sẽ giúp người khác

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.