2009-03-19 62 views
103

tôi cần phải chạy một truy vấn như:MySQL Kết quả như dấu phẩy tách ra danh sách

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 các tiểu chọn để trả về một dấu phẩy tách ra danh sách, thay vì một cột dữ liệu. Điều này thậm chí có thể, và nếu như vậy, làm thế nào?

Trả lời

206

Bạn có thể sử dụng GROUP_CONCAT để thực hiện điều đó, ví dụ: 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; 
+1

lớn Nó làm việc cho tôi Cảm ơn !!!!! – Devjosh

+9

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 cách bằng dấu phẩy vào trang, hãy sử dụng 'GROUP_CONCAT (CAST (s.name AS CHAR))' hoặc người nào khác nó sẽ trả về một thứ hoàn toàn bất thường như ' [BLOB - 20 byte] '. – devios1

+2

Mục đích là tốt và MySQL sẽ cho phép điều này, nhưng hãy cẩn thận (thường) 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 theo chuẩn SQL sẽ coi đây là lỗi. Trong trường hợp này, hoặc 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 để biểu diễn 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 có tác động đến kết quả cuối cùng. –

7

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

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

chỉnh sửa này chỉ hoạt động trong mySQL; 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 như foobar từ table1; trong máy chủ sql, bạn sẽ sử dụng + thay vì đường ống.

+1

Chính xác những gì tôi cần, cảm ơn! –

+0

Điều này không hoạt động trong trường hợp GROUP BY, trong khi GROUP_CONCAT() sẽ nối nội dung của một cột –

0

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 là số điện thoại di động là duy nhất. Vì vậy, tôi đã sử dụng truy vấn sau để đạt được điều đó.

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

Query Kết quả là dưới đây:

Accounts 
93348001,97530801,93348001,97530801 
89663501 
62630701 
6227895144840002 
60070021 
60070020 
60070019 
60070018 
60070017 
60070016 
60070015 
Các vấn đề liên quan