2012-10-05 37 views
10

Có thể câu hỏi của tôi không rõ ràng, hãy để tôi giải thích: Điều tôi cần là có được danh sách tất cả người dùng cùng với một số khách hàng/tổ hợp bán buôn tương ứng, mỗi khách hàng có 1 đến 4 khác nhau của khách hàng số/bán buôn kết hợpLàm thế nào để nhóm kết quả tham gia bên trong mysql từ hàng vào cột

Trong db của tôi, tôi có 2 bảng

USERS 
id | name 
--------- 
1 | a 
2 | b 

CLIENT_NUMBERS 
id | user_id | number | wholesaler 
---------------------------------- 
1 | 1  | ac1 | aw1 
2 | 1  | ac2 | aw2 
3 | 2  | bc1 | bw1 

Sử dụng một INNER đơn giản THAM GIA tôi đã hàng khách hàng nhân đôi, một cho mỗi tương ứng với số lượng khách hàng/người bán buôn

Tôi đã quản lý để sửa chữa các kết quả sử dụng GROUP_CONCAT trong truy vấn này:

SELECT a.id AS user_id, a.name AS Name 
GROUP_CONCAT(b.client_no, ', ', b.wholesaler SEPARATOR '; ') AS client_no_wholesaler 
FROM users AS a 
INNER JOIN client_numbers AS b ON a.id = b.user_id 
GROUP BY ID 

user_id | name | client_no_wholesaler 
-------------------------------------------- 
1  | a | ac1, aw1; ac2, aw2 
2  | b | bc1, bw1 

Cho đến nay rất tốt, nhưng tôi cần phải "nổ" sự kết hợp khách hàng số/bán buôn thành các cột khác nhau nên kết quả của tôi có thể trông như thế này :

user_id | name | client_no_wholesaler1 | client_no_wholesaler2 | ...up to 4 
---------------------------------------------------------------------------- 
1  | a | ac1, aw1    | ac2, aw2    | 
2  | b | bc1, bw1    |      | 

việc làm này sau khi nhận được kết quả truy vấn với một PHP đơn giản nổ không phải là một lựa chọn vì tôi đang sử dụng một lớp học để tạo ra một tập tin XLS và nó dựa trên các cột kết quả truy vấn của tôi, bất kỳ ý tưởng sẽ được đánh giá cao .

Trả lời

5

Điều bạn muốn thường được gọi là "pivot".

Đây là cách bạn mã nó trong sql sử dụng một phụ gia cho mỗi cột thêm:

SELECT 
    a.id AS user_id, 
    a.name AS Name, 
    CONCAT(b1.client_no, ', ', b1.wholesaler) AS client_no_wholesaler1, 
    CONCAT(b2.client_no, ', ', b2.wholesaler) AS client_no_wholesaler2, 
    CONCAT(b3.client_no, ', ', b3.wholesaler) AS client_no_wholesaler3, 
    CONCAT(b4.client_no, ', ', b4.wholesaler) AS client_no_wholesaler4 
FROM users AS a 
JOIN client_numbers AS b1 ON b1.user_id = a.id 
LEFT JOIN client_numbers AS b2 ON b2.user_id = a.id and b2.id > b1.id 
LEFT JOIN client_numbers AS b3 ON b3.user_id = a.id and b3.id > b2.id 
LEFT JOIN client_numbers AS b4 ON b4.user_id = a.id and b4.id > b3.id 
GROUP BY 1, 2 

Lưu ý rằng các phụ gia nhập tránh trùng lặp tham gia bằng cách cho thêm một điều kiện id ngày càng tăng trong ON khoản cho sự gia nhập thêm. Nếu id không phải là cột đặt hàng phù hợp, hãy chọn một thứ khác để tách các kết nối.

+0

"Pivot" tôi đã học được điều gì đó mới mẻ hôm nay, cảm ơn rất nhiều, truy vấn của bạn hoạt động như tôi cần – hey259

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