如何将mysql内部连接结果从行分组到列
Posted
技术标签:
【中文标题】如何将mysql内部连接结果从行分组到列【英文标题】:How to group mysql inner join results from rows into columns 【发布时间】:2012-09-26 03:15:30 【问题描述】:也许我的问题不是很清楚,请让我解释一下: 我需要的是获取所有用户的列表以及相应的客户编号/批发商组合,每个客户都有 1 到 4 个不同的客户编号/批发商组合
在我的数据库中,我有 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 文件,并且它基于我的查询结果列,任何想法都将不胜感激。
【问题讨论】:
【参考方案1】:您想要的通常称为“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 不是合适的排序列,请选择其他东西来分隔连接。
【讨论】:
"Pivot" 我今天学到了一些新东西,非常感谢,您的查询可以满足我的需要以上是关于如何将mysql内部连接结果从行分组到列的主要内容,如果未能解决你的问题,请参考以下文章
TSQL - 将 Sales_Rep 行分组到列并将 DESCRIP 列显示为行 无聚合