2012-11-19 43 views

Trả lời

100
select id, group_concat(`Name` separator ',') as `ColumnName` 
from 
(
    select id, concat(`Name`, ':', 
    group_concat(`Value` separator ',')) as `Name` 
    from mytbl 
    group by id, `Name` 
) tbl 
group by id; 

Bạn có thể nhìn thấy nó được thực hiện ở đây: Sql Fiddle Demo. Chính xác những gì bạn cần.

Cập nhật Tách theo hai bước. Đầu tiên chúng ta có một bảng có tất cả các giá trị (được phân cách bằng dấu phẩy) dựa vào một [Tên, id] duy nhất. Sau đó từ bảng thu được, chúng tôi nhận được tất cả tên và giá trị như một giá trị duy nhất đối với mỗi id duy nhất Xem này giải thích đây SQL Fiddle Demo (di chuyển xuống vì nó có hai bộ kết quả)

Sửa Có một sai lầm trong việc đọc câu hỏi, tôi chỉ được nhóm theo id. Nhưng hai nhóm_contacts là cần thiết nếu (Các giá trị sẽ được nối với nhau theo tên và id và sau đó trên tất cả theo id). câu trả lời trước là

select 
id,group_concat(concat(`name`,':',`value`) separator ',') 
as Result from mytbl group by id 

Bạn có thể nhìn thấy nó được thực hiện ở đây: SQL Fiddle Demo

+0

Điều này không đưa ra những gì Biswa yêu cầu. – eisberg

+3

cảm ơn bạn sami đây là những gì tôi đang yêu cầu @biswa – Biswa

+2

Tôi nghĩ rằng điều quan trọng là cảnh báo cho mọi người rằng chỉ sử dụng một loại máy tách có thể là bất lợi. Tôi đề nghị tạo dấu tách "tên" làm dấu chấm phẩy (;), và dấu tách giá trị có thể vẫn là dấu phẩy (,) –

15

Hãy thử:

CREATE TABLE test (
    ID INTEGER, 
    NAME VARCHAR (50), 
    VALUE INTEGER 
); 

INSERT INTO test VALUES (1, 'A', 4); 
INSERT INTO test VALUES (1, 'A', 5); 
INSERT INTO test VALUES (1, 'B', 8); 
INSERT INTO test VALUES (2, 'C', 9); 

SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',') 
FROM (
    SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME 
    FROM test 
    GROUP BY ID, NAME 
) AS A 
GROUP BY ID; 

SQL Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0

+2

Có eisberg +1. Câu trả lời của bạn khá chính xác và sớm hơn. Tôi đã mắc sai lầm trong lần trả lời đầu tiên của tôi – Sami

+0

@Sami Cảm ơn bạn! – eisberg

0

IF OBJECT_ID('master..test') is not null Drop table test

CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER); 
INSERT INTO test VALUES (1, 'A', 4); 
INSERT INTO test VALUES (1, 'A', 5); 
INSERT INTO test VALUES (1, 'B', 8); 
INSERT INTO test VALUES (2, 'C', 9); 

select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc 

tên bảng của tôi là kiểm tra, và cho bởi ghép tôi sử dụng Đối với XML Path ('') cú pháp. Hàm thứ sẽ chèn một chuỗi vào một chuỗi khác. Nó xóa một chiều dài ký tự được chỉ định trong chuỗi đầu tiên ở vị trí bắt đầu và sau đó chèn chuỗi thứ hai vào chuỗi đầu tiên ở vị trí bắt đầu.

chức năng STUFF trông như thế này: STUFF (character_expression, bắt đầu, chiều dài, character_expression)

character_expression là một biểu hiện của dữ liệu ký tự. character_expression có thể là hằng số, biến hoặc cột của dữ liệu ký tự hoặc dữ liệu nhị phân .

bắt đầu Là giá trị số nguyên chỉ định vị trí để bắt đầu xóa và chèn. Nếu bắt đầu hoặc độ dài là số âm, một chuỗi rỗng được trả về. Nếu bắt đầu dài hơn ký tự đầu tiên, chuỗi rỗng được trả về. bắt đầu có thể thuộc loại bigint.

chiều dài Là số nguyên chỉ định số ký tự cần xóa. Nếu độ dài dài hơn ký tự đầu tiên, thì việc xóa sẽ xảy ra với ký tự cuối cùng trong ký tự cuối cùng. chiều dài có thể là loại bigint.

5
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID 
+7

Sẽ rất tuyệt nếu bạn có thể thêm một số mô tả cho câu trả lời của bạn. Đây là một gợi ý để cải thiện câu trả lời này và trong tương lai. Cảm ơn! –

+0

được bỏ phiếu để không sử dụng một lựa chọn phụ – Heinz

+0

cảm ơn câu trả lời của bạn. điều này giúp tôi rất nhiều. –

0
SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result 
    FROM test GROUP BY id 

bạn phải sử dụng dàn diễn viên hoặc chuyển đổi, nếu không sẽ trở lại BLOB

kết quả là

id   Column 
1   A:4,A:5,B:8 
2   C:9 

bạn phải xử lý kết quả một lần nữa bởi một chương trình như trăn hay java

2

Trước hết, tôi không thấy lý do có ID không phải là duy nhất, nhưng tôi đoán đó là ID kết nối với một bảng khác. Thứ hai không cần truy vấn phụ, điều này sẽ làm nảy sinh máy chủ. Bạn làm điều này trong một truy vấn, như thế này

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id 

Bạn nhận được kết quả nhanh chóng và chính xác, và bạn có thể chia kết quả bởi đó SEPARATOR "|". Tôi luôn luôn sử dụng dấu phân cách này, bởi vì nó không thể tìm thấy nó bên trong một chuỗi, do đó nó là duy nhất. Không có vấn đề gì với hai A, bạn chỉ xác định giá trị. Hoặc bạn có thể có thêm một colum, với lá thư, mà thậm chí còn tốt hơn. Như sau:

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name 
Các vấn đề liên quan