如何将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内部连接结果从行分组到列的主要内容,如果未能解决你的问题,请参考以下文章

C-shell:从行到列打印结果

内部连接和分组依据

TSQL - 将 Sales_Rep 行分组到列并将 DESCRIP 列显示为行 无聚合

将 concat 和 sum 与左连接 mysql 分组

Java学习总结(十六)——MySQL数据库(中)分组,嵌套,连接查询及外键与关系表设计

内连接+计数+分组依据