2009-10-16 28 views
20

Tôi muốn đặt hàng các kết quả trong hàm GROUP_CONCAT. Vấn đề là, rằng sự lựa chọn trong GROUP_CONCAT chức năng là chức năng khác, như thế này (tưởng tượng chọn):Đặt hàng trong một MySQL GROUP_CONCAT có chức năng trong đó

SELECT a.name, 
    GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) ORDER BY b.id ASC) AS course 
FROM people a, stuff b, courses c 
GROUP BY a.id 

Tôi muốn có được một kết quả tương tự (theo yêu cầu của b.id):

michael 1:science,2:maths,3:physics 

nhưng tôi nhận được:

michael 2:maths,1:science,3:physics 

có ai biết làm thế nào tôi có thể đặt hàng bằng cách b.id trong group_concat của tôi ở đây?

+2

[GROUP_CONCAT] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) hỗ trợ riêng 'ORDER BY' khoản ... Không biết những gì người dùng định nghĩa chức năng là, hoặc không, sẽ không giúp chúng tôi để có thể giúp bạn. –

+0

Nó giống như tôi đã viết: chức năng "concat_ws" trong hàm "group_concat". Tôi chưa bao giờ nói đó là một hàm do người dùng định nghĩa. – acme

+0

Không rõ cách viết giải pháp hợp lệ vì cấu trúc bảng, nội dung và mối quan hệ giữa các bảng không được chỉ định (nghĩa là không có thông số tham gia). – outis

Trả lời

37

Nếu bất cứ ai quan tâm, tôi nghĩ rằng tôi đã tìm thấy một giải pháp cho ít nhất một vấn đề tương tự.

http://mahmudahsan.wordpress.com/2008/08/27/mysql-the-group_concat-function/

select GROUP_CONCAT(columnName order by someColumn SEPARATOR '|') from tableName where fieldId = p.id 

Trình tự do đi trong group_concat TRƯỚC tách nếu có.

+0

Tìm tốt !! Cám ơn vì đã chia sẻ! – rckehoe

+0

Tuyệt vời, Điều này đã cứu cuộc sống của tôi – Nadeeshaan

+0

Rất tốt !! Cảm ơn bạn đã chia sẻ –

2

Tôi không biết cách tiêu chuẩn để làm điều này. Truy vấn này làm việc, nhưng tôi sợ nó chỉ phụ thuộc vào một số chi tiết thực hiện:

SELECT a_name, group_concat(b_id) 
FROM (
    SELECT a.name AS a_name, b.id AS b_id 
    FROM tbl1 a, tbl2 b 
    ORDER BY a.name, b.id) a 
GROUP BY a_name 
+0

Sau một ít nghiên cứu, có vẻ như những gì tôi hỏi là không thể. Cảm ơn tuy nhiên! – acme

+0

đã thử điều này, bằng cách nào đó không hoạt động – slier

0
SELECT pub_id,GROUP_CONCAT(DISTINCT cate_id) 
FROM book_mast 
GROUP BY pub_id 
ORDER BY GROUP_CONCAT(DISTINCT cate_id) ASC; 
+1

Tôi muốn đặt hàng các phần tử tổng hợp TRONG 'GROUP_CONCAT' không phải toàn bộ kết quả. – acme

0
SELECT generated.name, GROUP_CONCAT(generated.data) 
FROM (
    SELECT people.name, CONCAST_WS(":", stuff.id, courses.name) data 
    FROM people, stuff, courses 
    ORDER BY stuff.id, people.name 
) generated 
GROUP BY generated.name 
2

Không cần đăng ký.

SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data 
FROM people, stuff, courses 
ORDER BY stuff.id, people.name 
3

Tôi biết điều này thực sự là cũ, nhưng chỉ là bây giờ tôi đang tìm kiếm câu trả lời một câu trả lời và @ korny đã quyết định cho tôi ý tưởng cho việc này:

SELECT a.name, 
GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) 
      ORDER BY CONCAT_WS(':', b.id, c.name) ASC) AS course 
FROM people a, stuff b, courses c 
GROUP BY a.id 

(Và nó làm việc cho tôi, nếu điều đó không rõ ràng :-))

+0

Tôi không hoàn toàn chắc chắn, nhưng tôi tin rằng điều này giống như sử dụng 'GROUP_CONCAT (DISTINCT CONCAT_WS (':', b.id, c.name) ORDER BY 1)'. Đó là đơn giản hơn nhiều, nếu nó hoạt động! – Doin

+0

Điều đó đã dạy tôi điều gì đó mới mẻ, cảm ơn! :-) – AMeiri

+0

Có! Câu trả lời thực sự chính xác !!! (Tất nhiên không ai làm chính xác OP là gì! Chúng tôi đang ở trên trang này vì chúng tôi muốn biết cách tham khảo kết quả của DISTINCT Func (...) trong Order By, và câu trả lời là bạn chỉ cần gọi Func một lần nữa.) – HoldOffHunger

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