2012-10-05 32 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