2012-10-05 60 views
10

也許我的問題不是很清楚,請讓我解釋一下: 我需要的是獲取所有用戶的列表以及相應的客戶端編號/批發商組合,每一個客戶都有1到4個不同的客戶端編號/批發商組合如何將mysql內部連接結果從行分組到列

在我的數據庫我有2個表

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 

使用一個簡單的INNER JOIN我得到了客戶的行復制,每一個相應的客戶端數量/批發商

我已經成功在此查詢使用GROUP_CONCAT修復結果:

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 

到目前爲止好,但我需要「爆炸」的客戶數量/批發商組合成不同的列,所以我的結果是這樣的:

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

得到的查詢結果與一個簡單的PHP後這樣做爆炸是不是一種選擇,因爲我使用一個類來生成XLS文件及其基於我的查詢結果列,任何想法可以理解的。

回答

5

你想要什麼通常稱爲「pivot」。

這裏是你如何使用額外加入的每個額外的列在SQL代碼是:

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 

注意,額外加入避免重複通過爲ON子句中的另外的不斷增加的ID條件加入額外的連接。如果id不是合適的排序列,則選擇其他內容來分隔連接。

+0

「Pivot」我今天學到了一些新東西,非常感謝,您的查詢按我需要 – hey259